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、来自执行它自己的参数。哪个程序生成命令行 或人手工输入命令行 执行它
tiger
3
我猜测,"%1"=="7"
中的 %1 是变量1的意思,==就是等于的判断,因为一个=是赋值的意思,所以等于要用两个,整体的意思就是判断变量1是不是等于7。
其它的我就不懂了,毕竟我只是一只小虎虎。
allor
4
这个脚本的主要是供命令行下带参数执行的,双击执行就默认无参数。
各种乱七八糟的符号都是在处理参数或者字符串,以及规避该死的路径/文件名坑。
批处理就是这么落后的玩意
第一行: 判断第一个参数,如果不等于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 个赞
是的,我也只能看懂到这一步,但是不知道为什么要这么做,楼下的 @allor 有详细的解释。
感谢详细的指教,关于第一行还有不明之处:
①7
起的是什么作用,可以是其他字符吗?
②我用echo
看了一下,%0
和"%~0"
显示的一样,是不是两者可以替换?
③是不是现在建议用PowerShell取代CMD?
allor
8
1 如果你贴的已经是 install.bat 的全部内容的话,那么这个 7
并没有什么实际意义,可能是基于其他脚本进行修改删减时的残留,或者作者的偏好。
2 这又是一个坑,你把 echo %0 "%~0"
存为 test.bat,双击运行和命令行运行看看,二者结果并不一致。
3 看需求吧,如果你已经掌握了相应的脚本,那么适用的工具就是好工具。
但如果你是准备从中二选一新学一门的话,建议学习 PowerShell ,它不仅更强大,而且更加现代化。
现在学 PowerShell ,以后再学别的脚本语言也有所帮助,毕竟现代脚本语言逻辑都是相通的。
而现在学过时的 CMD ,你只能学会一堆别无用处的骚操作(所有的骚操作都是被逼无奈)。
比如说加法运算,08+1,你可以试一下怎样才能在 CMD 中得出正确结果
1 贴的是全部内容,所以不理解插个参数的用意,不过感谢学会了这种语法。
2 cmd的结果居然没有路径……
3 cmd相对懂一点,了解过PS感觉不习惯,就是发现PS比较强大。
4 08+1我是没搞定,光8+1我觉得就够麻烦了。