9zhmke 发表于 2024-2-21 09:54:13

抛个砖头--PrimoCache批处理自动设置

在勤奋的狐狸波贴子里提到PrimoCache命令行配置(http://bbs.wuyou.net/forum.php?mod=viewthread&tid=434147)
刚好在之前也有批处理设置的想法,于是在fulibo的指引下越滑越远......
最先想到的就是按照自己的机器配置写个简单批处理:

    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静默


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

以下批处理在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


chibuzhu 发表于 2024-2-21 10:03:23

{:1_195:}感谢分享

temptemp 发表于 2024-2-21 10:18:37

通用版不太好搞,毕竟硬件不同,给自己设备做个还是挺好,一键设置

yyz2191958 发表于 2024-2-21 10:22:30

谢谢分享

c5215016 发表于 2024-2-21 11:09:00

谢谢

yzw92 发表于 2024-2-21 11:10:56

谢楼主分享

promrhxq 发表于 2024-2-21 11:35:19

批处理确实高效   不过也确实考验耐心和技术

d9o 发表于 2024-2-21 12:22:55

谢谢干货

wang1126 发表于 2024-2-21 13:12:34

谢谢楼主分享

denslin 发表于 2024-2-21 13:29:17

谢谢分享

sulong 发表于 2024-2-21 13:35:05

谢谢分享,研究一下楼主的各项设置

tilltotell007 发表于 2024-2-21 13:38:42

谢谢楼主分享好东西

guong 发表于 2024-2-21 13:48:23

感谢楼主分享

jctsky 发表于 2024-2-21 13:57:52

我用的是UltraRAMDisk,设置简单

yc2428 发表于 2024-2-21 15:04:58

谢谢分享。

chairmansu 发表于 2024-2-21 17:23:06

感谢分享

fybhwsx 发表于 2024-2-22 16:01:01

感谢分享,有没有Primo Ramdisk的命令安装和配置呢。

qiwuqi 发表于 2024-2-22 16:09:29

感谢分享。。。。。

sczxchen 发表于 2024-2-22 16:17:32

牛{:1_193:}

Climbing 发表于 2024-2-23 11:20:15

PrimoCache在win10之前对系统的加速很明显,尤其是对机械硬盘,但win10之后就不是很明显了。虽然我现在还是必装这个软件,但基本上就指定1G-2G内存当缓存就完了。

9zhmke 发表于 2024-2-23 13:27:18

fybhwsx 发表于 2024-2-22 16:01
感谢分享,有没有Primo Ramdisk的命令安装和配置呢。

命令行可以直接用问号来查询功能

9zhmke 发表于 2024-2-23 13:29:46

Climbing 发表于 2024-2-23 11:20
PrimoCache在win10之前对系统的加速很明显,尤其是对机械硬盘,但win10之后就不是很明显了。虽然我现在还是 ...

我的机械D盘16T,本身就慢,我自己也是一段时间弄这个一段时间弄那个的,如果不对常用部分缓存的话,就太慢了。配了32G内存,弄了4G来缓存D盘,然后把固态分了一部分二缓给D盘

zhenghui 发表于 2024-2-23 14:19:45

感谢分享、学习一下

IT小森 发表于 2024-2-23 14:38:52

感谢分享

2267981144 发表于 2024-2-23 18:55:30

多谢热心提供分享!

dayeye 发表于 2024-2-27 17:09:30

学习

hehuiying 发表于 2024-4-12 11:26:19

谢谢分享

无犹启动 发表于 2024-4-26 17:21:30

谢谢分享
页: [1]
查看完整版本: 抛个砖头--PrimoCache批处理自动设置