Windows批处理文件中一些不太为人所知,但重要且有用的特性是什么?
指南:
- 每个答案只涉及一个特性
- 提供特性的简短描述和示例,而不是只提供文档链接
- 答案限于本地功能,即不需要其他软件,如Windows资源工具包
澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(另请参见:Windows批处理文件:.bat与.cmd有何区别?)
Windows批处理文件中一些不太为人所知,但重要且有用的特性是什么?
指南:
澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(另请参见:Windows批处理文件:.bat与.cmd有何区别?)
call set SomeEnvVariable_%extension%=%%%somevalue%%%
使用call设置变量,其名称取决于其他变量。如果与某些变量命名规则一起使用,您可以通过使用谨慎的命名规则模拟数据集合,如数组或字典。三个%符号围绕somevalue是为了在调用之后并在set被调用之前将其评估为一个由单个%符号包围的变量名称。这意味着两个连续的%符号会转义为一个单独的%字符,然后再次扩展它,因此somevalue实际上是一个名称指针。
call set TempVar=%%SomeEnvVariable_%extension%%%
setlocal EnableDelayedExpansion
在路径上搜索可执行文件(或其他路径样式字符串,如果需要):
c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe
c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe
c:\>
::
代替REM
进行注释:要小心!::
是CALL标签的特殊情况,像注释一样起作用。当它在括号内使用时,例如在FOR或IF循环中,函数会过早退出。非常令人沮丧的调试!请参阅http://www.ss64.com/nt/rem.html获取完整说明。 (作为新答案添加,而不是作为上面首次提到此事的评论,因为我还不配评论:0)
现在许多人使用GOTO :EOF来终止他们的批处理文件,但你也可以使用EXIT /B来实现这个目的。
使用EXIT /B的优点是,您可以在EXIT /B后添加一个错误级别,它将以该错误级别退出。
本地变量仍然会被解析到使用ENDLOCAL的行。这允许使用一些技巧,例如:
ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%
ENDLOCAL & SET MYLOCAL=%MYLOCAL%
你会发现,你新的MYLOCAL变量实际上是一个普通的环境变量,而不是你本来想要的本地化变量。
调用Set - 展开环境变量多层深度。
在http://ss64.com/nt/call.html#advanced上找到了这个答案,是回答另一个SO问题批处理文件中在for循环中初始化的变量
set VarName=Param
set Param=This
call set Answer=%%%Varname%%%
Echo %Answer%
set VarName=Param
set Param=This
call set Answer=%Param%
Echo This
This
子程序(输出42):
@echo off
call :answer 42
goto :eof
:do_something
echo %1
goto :eof
以及返回值的子程序(输出0、1、2等):
@echo off
setlocal enableextensions enabledelayedexpansion
call :seq_init seq1
:loop1
if not %seq1%== 10 (
call :seq_next seq1
echo !seq1!
goto :loop1
)
endlocal
goto :eof
:seq_init
set /a "%1 = -1"
goto :eof
:seq_next
set /a "seq_next_tmp1 = %1"
set /a "%1 = %seq_next_tmp1% + 1"
set seq_next_tmp1=
goto :eof
我最喜欢在cmd.exe中使用快速编辑模式。虽然这有点离题,但在与命令行交互时,它可以拯救你的生命。不,我没有夸张——你只会在死之前看到caret-capitol-v一定次数;你看得越多,就会死得越快。
(您也可以从UI设置此选项,这可能是更好的方法。请参阅评论中的说明。还有一个很好的一行脚本来完成此操作。)
现在,要复制,只需左键单击并拖动以选择,然后右键单击即可复制。要粘贴,只需右键单击。
再也不用^V^V^V^V^V^V^V^V^V^V^V^V^V^V了!
糟糕,我想我刚刚杀了某个人。对不起!
即使批处理文件的输出已经通过 > con
语法重定向到文件中,仍然可以将输出重定向到控制台。
示例: foo.cmd:
echo a
echo b > con
调用:
foo.cmd > output.txt
"a"
被发送到output.txt
,而"b"
则会显示在控制台上。SHIFT
:ParseArgs
if "%1"=="" (
goto :DoneParsingArgs
)
rem ... do something with %1 ...
shift
goto :ParseArgs
:DoneParsingArgs
rem ...