ImDiskTk的安装批处理请教

if not "%1"=="7" start /min cmd /c ""%~0" 7 %*" & exit /b
set F=%TEMP%\ImDisk%TIME::=%
extrac32.exe /e /l "%F%" "%~dp0files.cab"
"%F%\config.exe" %2 %3 %4
rd /s /q "%F%"

以上是ImDiskTk安装批处理install.bat中的内容,请教下批处理高手:
1.第一行中的

"%1"=="7"

""%~0" 7 %*"

是什么意思?
2.第四行是安装命令,它的3个参数分别是什么内容?从哪里传递进去的?

1、 1 就是 第一个命令行参数 * 估计是 所有参数

2、来自执行它自己的参数。哪个程序生成命令行 或人手工输入命令行 执行它

我猜测,"%1"=="7" 中的 %1 是变量1的意思,==就是等于的判断,因为一个=是赋值的意思,所以等于要用两个,整体的意思就是判断变量1是不是等于7。
其它的我就不懂了,毕竟我只是一只小虎虎。

这个脚本的主要是供命令行下带参数执行的,双击执行就默认无参数。
各种乱七八糟的符号都是在处理参数或者字符串,以及规避该死的路径/文件名坑。
批处理就是这么落后的玩意 :sweat:

第一行: 判断第一个参数,如果不等于7,就插入一个参数7到第一位,其余参数后移,再重新执行
%1 = 第一参数
%0 = install.bat 的文件名 → %~0 = 去掉引号的文件名 → "%~0" = 一个规避了路径/文件的空格坑和引号坑的文件名
%* = 所有参数

第二行: 设置变量 F 为临时目录
%TEMP% = 系统变量,临时目录
%TIME% = 当前时间( H:mm:ss.SS) → %TIME::=% = 第一个:表示对时间字符串进行操作 → := 表示将时间字符串里的 :替换为空( H:mm:ss.SS → Hmmss.SS)
又是为了规避路径/文件名的坑

第三行: 解压
%~dp0 = %0 + ~ + d + p = 从install.bat 的文件名扩展得到其驱动器及路径(x:\xxx)

第四行: 执行config.exe,后面的 %2 %3 %4 就是对应执行 install.bat 时带的第2、3、4个参数,如果第一个参数不为7的话,就是原本的1、2、3参数。如果是直接双击执行,那么就是空。

第五行不用解释了吧……

2 Likes

批处理太难了

是的,我也只能看懂到这一步,但是不知道为什么要这么做,楼下的 @allor 有详细的解释。

感谢详细的指教,关于第一行还有不明之处:
7起的是什么作用,可以是其他字符吗?
②我用echo看了一下,%0"%~0"显示的一样,是不是两者可以替换?
③是不是现在建议用PowerShell取代CMD?

1 如果你贴的已经是 install.bat 的全部内容的话,那么这个 7 并没有什么实际意义,可能是基于其他脚本进行修改删减时的残留,或者作者的偏好。

2 这又是一个坑,你把 echo %0 "%~0"存为 test.bat,双击运行和命令行运行看看,二者结果并不一致。

3 看需求吧,如果你已经掌握了相应的脚本,那么适用的工具就是好工具。
但如果你是准备从中二选一新学一门的话,建议学习 PowerShell ,它不仅更强大,而且更加现代化。

现在学 PowerShell ,以后再学别的脚本语言也有所帮助,毕竟现代脚本语言逻辑都是相通的。
而现在学过时的 CMD ,你只能学会一堆别无用处的骚操作(所有的骚操作都是被逼无奈)。
比如说加法运算,08+1,你可以试一下怎样才能在 CMD 中得出正确结果 :grin:

1 贴的是全部内容,所以不理解插个参数的用意,不过感谢学会了这种语法。

2 cmd的结果居然没有路径……

3 cmd相对懂一点,了解过PS感觉不习惯,就是发现PS比较强大。

4 08+1我是没搞定,光8+1我觉得就够麻烦了。