刚好在之前也有批处理设置的想法,于是在fulibo的指引下越滑越远......
最先想到的就是按照自己的机器配置写个简单批处理:
[ol]
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静默
[/ol]复制代码
我和我推荐给周围朋友的配置,都是固态+机械。固态用于启动+二缓,通常128-512G,机械用于存储数据,通常0.5-18T。
大机械硬盘性价比高,很多家庭都有小孩从小到大的照片视频,收藏的歌曲视频电影、必备的软件什么的机械盘万一
有误操作,数据可恢复,固态就呵呵了。
配置不是重点,大家也不必拿这些考虑做讨论,主要想讨论的,是怎么配置PrimoCache更合理,以及简化配置的方法。诚
心地说,用各种语言和脚本,就没有比批处理更差的了,效率低不说,还容易出错。但是,批处理的即改即用和不要
求环境仍然使其生存了下来。本次探讨是以批处理为基础的命令行PrimoCache配置。由于自身经常下载各大论坛新出
的操作系统安装到自用实体机测试,重装系统太频繁,只好大量使用绿色软件,连最常用的静默安装软件们也要弄个
批处理方式来安装。PrimoCache是我的必装软件之一,每次手动设置时都在想要花点时间弄个自动设置方法出来。
后来发现,在帮同事装机时还得按不同的环境用不同的参数,于是写了个自动设置版初稿
以下批处理在Win10x64中文版下调试,不确定能英文版或磁盘没有卷标的电脑上正确运行,仅做技术讨论,
内有删除分区的操作,数据重要的电脑请务必谨慎,数据掉了我也没办法负责任。
希望有探讨的同学共同完善
[ol]
@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
[/ol]复制代码