抛个砖头--批处理自动设置--能有玉否?

交流 PrimoCache软件使用过程中遇到的问题以及心得等
这里提供官方的技术支持
回复
msold5
1级用户
1级用户
帖子: 4
注册时间: 周二 1月 05, 2016 6:47 pm

抛个砖头--批处理自动设置--能有玉否?

帖子 msold5 »

我和我推荐给周围朋友的配置,都是固态用于启动+二缓,通常128-512G,机械用于存储数据,通常0.5-18T。
大机械硬盘性价比高,很多家庭都有小孩从小到大的照片视频,收藏的歌曲视频电影、必备的软件什么的
机械盘万一有误操作,数据可恢复,固态就呵呵了
配置不是重点,大家也不必拿这些考虑做讨论,主要想讨论的,是怎么配置PrimoCache更合理,以及简化配置
的方法。诚心地说,用各种语言和脚本,就没有比批处理更差的了,效率低不说,还容易出错。但是,批
处理的即改即用和不要求环境仍然使其生存了下来。本次探讨是以批处理为基础的命令行PrimoCache配置。
由于自身经常下载各大论坛新出的操作系统安装到自用实体机测试,重装系统太频繁,只好大量使用绿色软
件,连最常用的静默安装软件们也要弄个批处理方式来安装。PrimoCache是我的必装软件之一,每次手动
设置时都在想要花点时间弄个自动设置方法出来。
最先想到的就是按照自己的机器配置写个简单批处理:

代码: 全选

    cd /d "C:\Program Files\PrimoCache"
    set disk=没找到盘
    for /f "tokens=2" %%i in ('rxpcc ls^|find "Vol"^|find "Level-2"') do set disk=%%i
    for /f "tokens=4" %%i in ('rxpcc ls^|find "%disk%"') do set disk=%%i
    echo 二级缓存是%disk%--{A340EFBD-5A9F-444A-B642-A42B5A9CD496}

    rxpcc new -v d -m 4096 -l %disk% -r 255,3 -w 20 -a average,freewritten,flushsleep,flushtoL2 -p=fromL2 -s
    rem D盘,内存4G,二级缓存3%写入,缓存时间20秒,均衡模式,待机刷入缓存,L1满时转L2,-p优先取L2,-s静默
    rxpcc new -v c -m 4096 -w INF -a average,freewritten,flushsleep -p=boot -s
    rem C盘,内存4G,缓存时间无限,均衡模式,待机刷入缓存,-p启动时开始,优先取L2,-s静默
后来发现,在帮同事装机时还得按不同的环境用不同的参数,于是写了个自动设置版初稿
以下批处理在Win10x64中文版下调试,不确定能英文版或磁盘没有卷标的电脑上正确运行,仅做技术讨论,
内有删除分区的操作,数据重要的电脑请务必谨慎,数据掉了我也没办法负责任。
希望有探讨的同学共同完善

代码: 全选

    @echo Off
    rem 要多测试,比如卷标为空时,取分区空间位置是否正确等
    set disk=%ProgramFiles%\PrimoCache
    if not exist "%disk%\FancyCcV.exe" set msg1=程序未安装成功,不能设置PrimoCache.&goto ERROR
    cd /d "%disk%"
    setlocal enabledelayedexpansion
    set debug=0
    set "MB= "
    set GB=000
    set TB=000000

    echo 查几只硬盘、是否SSD+机械盘、内存大小
    set SSD_NUM=0
    for /f %%i in ('powershell Get-PhysicalDisk^|find "SSD"') do set SSD=%%i && set /a SSD_NUM=!SSD_NUM! + 1
    set HDD_NUM=0
    for /f %%i in ('powershell Get-PhysicalDisk^|find "HDD"') do set HDD=%%i && set /a HDD_NUM=!HDD_NUM! + 1
    wmic os get TotalVisibleMemorySize
    if %SSD_NUM% gtr 1 set msg1=固态硬盘大于一只,程序无法正确判断应该怎么设缓存.
    if %HDD_NUM% gtr 1 set msg2=机械硬盘大于一只,程序无法正确判断应该怎么设缓存.
    for /f "tokens=2*" %%i in ('systeminfo^|find "物理内存总量"') do set memory=%%i %%j
    if not "%memory:~-2%"=="MB" set msg3=内存大小超出认知,程序无法正确判断应该怎么设缓存.
    rem 去除最后两位,去除中间的逗号
    set memory=%memory:~0,-2%
    set /a memory=%memory:,=% /1000
    if %memory% lss 8 set msg3=内存太小,还是不使用缓存程序好些.
    if "%msg1%%msg2%%msg3%" gtr "" goto ERROR
    echo 固态%SSD_NUM%只,排位%SSD%;机械%HDD_NUM%只,排位%HDD%,内存大小:%memory%
    rem =======================================================================================================
    echo 查看系统磁盘环境
    set hd=MBR
    for /f "tokens=2,8" %%i in ('echo list disk ^|diskpart') do (
        set disks=%%i
        if "%%j"=="*" set hd=GPT
        )
    set /a disks=%disks% + 1
    if %debug%==1 echo 磁盘引导方式是:%hd%,共有%disks%只磁盘
    set boot=没找到
    set system=没找到
    for /f "tokens=2,3,6,7,8" %%i in ('echo list vol ^|diskpart^|find "启动"') do (
        set disk_c=%%i
        set system=%%j
        if "%%l"=="TB" set c_size_0=000000
        if "%%l"=="GB" set c_size_0=000
        if "%%l"=="MB" set c_size_0=
        set c_size=%%k%c_size_0%
        if "%%m"=="TB" set c_size_0=000000
        if "%%m"=="GB" set c_size_0=000
        if "%%m"=="MB" set c_size_0=
        if "%%k"=="磁盘分区" set c_size=%%l%c_size_0%
        )
    for /f "tokens=2" %%i in ('echo list vol ^|diskpart^|find "系统"') do set boot=%%i
    if %debug%==1 echo 启动分区号是%boot%,系统安装到了第%disk_c%个分区,即%system%盘,大小是%c_size%兆
    for /f "tokens=2" %%i in ('echo list vol^|diskpart^|find "磁盘分区"') do set vols=%%i
    set /a vols=%vols% + 1
    if %debug%==1 echo 硬盘共有%vols%个分区
    set disk_u=没找到
    for /f "tokens=3" %%i in ('echo list vol^|diskpart^|find "可移动"') do set disk_u=%%i& goto U_NEXT
    :U_NEXT
    if %debug%==1 echo 第一个U盘:%disk_u%
    set udisks=0
    for /f "tokens=3" %%i in ('echo list vol^|diskpart^|find "可移动"') do set /a udisks=!udisks! + 1
    if %debug%==1 echo 共有%udisks%个U盘
    echo 共有%disks%只磁盘,共有%udisks%个U盘,第一只U盘:%disk_u%。固态硬盘共有%vols%个分区,磁盘引导方式是:%hd%,
    echo 启动分区号是%boot%,系统安装到了第%disk_c%个分区,即%system%盘,大小是%c_size%兆
    rem =======================================================================================================
    echo 是否SSD有空余未分区空间
    (    echo.select disk %SSD%
        echo.list partition
    )|diskpart|find "分区   ">%tmp%\diskpart.txt
    set all=0
    set num=0
    set level2_num=0
    set level2_size=0
    set level2=0
    for /f "tokens=2,3,4,5" %%i in (%tmp%\diskpart.txt) do (
        set size=%%k!%%l!
        set /a all=!all! + !size!
        set part%%i=!size!
        set /a num=!num! + 1
        if "%%j"=="未知" set /a level2_num=!level2_num! + 1 && set level2=!num! && set level2_size=!size!
        echo 分区!num!单位是%%l,size=!size!M,all=!all!
        )
    set /a all=%all% / 1000
    for /f "tokens=4,5" %%i in ('echo list disk^|diskpart^|find "磁盘 %SSD%"') do set /a size=%%i!%%j! /1000
    if not "%all%"=="%size%" set msg=空间未分完
    if     "%all%"=="%size%" set msg=已分配完
    echo 有%level2_num%个疑是二级缓存,最终分区%level2%,大小为%level2_size%M
    if not %level2_num%==1 set set level2=& set level2_size=
    for /f "tokens=5" %%i in ('rxpcc ls^|find "Vol"^|find "Level-2"') do set level2_size_find=%%i
    set ok=0
    if "%level2_size_find:~-2%"=="GB" set ok=1
    if "%level2_num%"=="1" set ok=1
    set level2_size_num=%level2_size_find:~0,-2%
    echo 二级缓存大小是%level2_size_num%
    set /a level2_size_num=%level2_size_num% 2>nul
    echo 二级缓存取整数后是%level2_size_num%
    set /a level2_size=level2_size / 1000

    echo 硬盘%SSD%是%size%G大小,!num!个分区共用了%all%G,%msg%。
    echo 有%level2_num%个疑是二级缓存,最终分区%level2%,大小为%level2_size%G,而寻找到的二缓大小是%level2_size_num%G。
    set /a tmp1=%level2_size_num% - %level2_size%
    if %level2_size% gtr %level2_size_num% set tmp1=%level2_size% - %level2_size_num%
    if tmp1 gtr 1 set ok=0
    if "%msg%"=="已分配完" if %ok%==0 goto PrimoCache
    echo 找到的二级缓存分区和疑似分区大小相同,现在删除并重建...
    (    echo.select disk %SSD%
        echo.select partition %level2%
        echo.delete part
        echo.list part
        echo.exit
    )|diskpart|find "分区   "
    set /a all=%all% - %level2_size%
    rem =======================================================================================================
    echo 正在把SSD剩余空间分配给二级缓存
    set /a SSD_Free=152000
    if %SSD_Free% lss 5 set msg1=SSD余空太小,放弃建二级缓存
    if exist "L:\." set msg2=建立SSD新分区时,驱动器号L被占用无法继续分配.& goto ERROR 
    (    echo.select disk %SSD%
        echo.list partition
    )|diskpart|find "分区   ">%tmp%\diskpart.txt
    set all=0
    set num_new=0
    for /f "tokens=2,4,5" %%i in (%tmp%\diskpart.txt) do (
        set size=%%j!%%k!
        set /a all=!all! + !size!
        set part%%i=!size!
        set /a num_new=!num_new! + 1
        if "%SSD_Free%"=="!size!" set SSD_NEW_Free=%%j%%k&&set SSD_NEW_GB=!size!
        echo 分区!num_new!单位是%%k,size=!size!M,all=!all!,SSD_NEW_GB=!SSD_NEW_GB!
        )
    set /a all=%all% / 1000
    rem del %tmp%\diskpart.txt
    set /a SSD_NEW_PART = %num_new% - %num%
    if not "%SSD_NEW_PART%"=="1" set msg1=建立SSD新分区出错,请检查.& goto ERROR
    if %SSD_NEW_GB% gtr 300 set msg2=建立SSD新分区有点大
    if %SSD_NEW_GB% lss 3   set msg2=建立SSD新分区有点小
    echo 新建的分区号是%num_new%,大小是%SSD_NEW_GB%GB,即将转换为二级缓存
    set SSD_NEW_VOL=
    for /f "tokens=2,3,7" %%i in ('echo list vol^|diskpart^|find "RAW"') do (
        rem 格式为RAW并且驱动器号是L,大小又相同,肯定就没错了。
        if %%j==L if "%%k"=="%SSD_NEW_GB% GB" set SSD_NEW_VOL=%%i
        )
    echo rxpcc storage format -v %SSD_NEW_VOL% -s
    rem =======================================================================================================
    :PrimoCache
    set disk=没找到盘
    for /f "tokens=2" %%i in ('rxpcc ls^|find "Vol"^|find "Level-2"') do set disk=%%i
    echo 得到二级缓存位于RX排位中的%disk%
    for /f "tokens=4" %%i in ('rxpcc ls^|find "%disk%"') do set disk=%%i
    echo 得到二级缓存卷代码是%disk%,比如({A340EFBD-5A9F-444A-B642-A42B5A9CD496})
    set Primo=-a average,freewritten,flushsleep
    rem 均衡模式,待机刷入缓存;后面一句:二级缓存3%写入,L1满时转L2,-p优先取L2
    if not "%disk%"=="没找到盘" set Primo=-l %disk% -r 255,3 -a average,freewritten,flushsleep,flushtoL2 -p=fromL2
    echo 正在设置D盘缓存,内存4G,缓存时间20秒,-s静默 -l %disk% -r 255,3设二级缓存3^%写入:
    echo rxpcc new -v d -m 4096 -w 20 -s %Primo%
    rxpcc new -v d -m 4096 -w 20 -s %Primo%
    echo 正在设置C盘缓存,内存4G,缓存时间无限,均衡模式,待机刷入缓存,-p启动时开始,优先取L2,-s静默:
    echo rxpcc new -v c -m 4096 -w INF -a average,freewritten,flushsleep -p=boot -s
    rxpcc new -v c -m 4096 -w INF -a average,freewritten,flushsleep -p=boot -s
    rem =======================================================================================================
    :ERROR
    :END
    echo.%msg1%%msg2%%msg3%
    PUSHD "%~DP0"
    del "%0"
    timeout 8
回复