Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
当前回答
使用&::的内联注释。
:: This is my batch file which does stuff.
copy thisstuff thatstuff &:: We need to make a backup in case we screw up!
:: ... do lots of other stuff
这是如何工作的呢?这是一个丑陋的黑客。&是命令分隔符,大致近似于;UNIX shell。::是另一个丑陋的黑客,有点像REM语句。最终结果是执行命令,然后执行一个什么都不做的命令,从而近似于注释。
这并不是在所有情况下都有效,但它通常足够有用。
其他回答
关于使用::而不是REM进行评论:要小心!::是CALL标签的一种特殊情况,作用类似于注释。当在括号内使用时,例如在for或IF循环中,函数将提前退出。调试非常令人沮丧!
详细描述请参见http://www.ss64.com/nt/rem.html。
(添加一个新的答案,而不是上面第一次提到的评论,因为我还不值得评论:0)
FOR命令!虽然我讨厌写批处理文件,但我很感激它。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
将解析myfile.txt中的每一行,忽略以分号开头的行,将每行的第2和第3个标记传递给for主体,标记由逗号和/或空格分隔。 注意for语句引用%i获取第二个令牌,引用%j获取第三个令牌,引用%k获取第三个令牌之后的所有剩余令牌。
你也可以用它来遍历目录、目录内容等等…
狡猾的等待N秒的技巧(不是cmd.exe的一部分,但不是额外的软件,因为它是Windows自带的),参见ping行。您需要N+1个ping,因为第一个ping没有延迟。
echo %time%
call :waitfor 5
echo %time%
goto :eof
:waitfor
setlocal
set /a "t = %1 + 1"
>nul ping 127.0.0.1 -n %t%
endlocal
goto :eof
能够运行命令并处理输出(如bash中的'$()'的反引号)。
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
如果文件名中有空格,可以这样写:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
SHIFT
这是一种在命令行上迭代传递到脚本(或子例程)的可变数量的参数的方法。在最简单的用法中,它将%2转换为%1,将%3转换为%2,依此类推。(你也可以传递一个参数给SHIFT来跳过多个参数。)这使得命令具有“破坏性”(即%1永远消失),但它允许您避免硬编码支持的参数的最大数量。
下面是一个简短的例子,一次处理一个命令行参数:
:ParseArgs
if "%1"=="" (
goto :DoneParsingArgs
)
rem ... do something with %1 ...
shift
goto :ParseArgs
:DoneParsingArgs
rem ...