Windows批处理文件中鲜为人知但重要且有用的功能有哪些?
指导原则:
- 每个答案一项功能
- 提供功能的简短说明和示例,而不仅仅是文档的链接
- 将答案限制为本机功能,即不需要其他软件,例如Windows Resource Kit
澄清:我们这里指的是cmd.exe处理的脚本,这是WinNT变体的默认设置。
(另请参阅:Windows批处理文件:.bat与.cmd?)
Windows批处理文件中鲜为人知但重要且有用的功能有哪些?
指导原则:
澄清:我们这里指的是cmd.exe处理的脚本,这是WinNT变体的默认设置。
(另请参阅:Windows批处理文件:.bat与.cmd?)
Answers:
行继续:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
call C:\WINDOWS\system32\ntbackup.exe backup /V:yes /R:no /RS:no /HC:off /M normal /L:s @daily.bks /F daily.bkf
。要了解该行的所有参数,只需运行C:\WINDOWS\system32\ntbackup.exe /?
。
不确定这在批处理文件中将有多有用,但是在命令提示符下使用它是非常方便的命令:
C:\some_directory> start .
这将在“ some_directory”文件夹中打开Windows资源管理器。
我发现这节省了很多时间。
open .
执行相同的操作。
start
除了打开当前文件夹外,还可以做更多的事情。您可以将其传递给任何文件,它将使用配置的查看器将其打开。给它一个URL,然后您的默认浏览器打开,等等……
我一直发现很难阅读每一行上由关键字标记的注释:
REM blah blah blah
更容易阅读:
:: blah blah blah
rem
是一个文档化的关键字,而::
仅仅是实现细节。虽然不太可能::
会停止工作,但通常建议不要依赖未记录的行为。
goto :
跳转到标签。 :-)
并且goto -)
也将起作用。
可变子串:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
for %a in ...
)的局部变量结合使用,因为它们不需要关闭变量百分号,也不需要环境变量。您必须首先将它们分配给环境变量(使用延迟扩展!),然后提取一个子字符串。
FOR命令!尽管我讨厌编写批处理文件,但我对此表示感谢。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会解析myfile.txt中的每一行,而忽略以分号开头的行,将第二行和第三行令牌从每一行传递到for正文,并以逗号和/或空格分隔。请注意,for主体语句引用%i获取第二个令牌,%j获取第三个令牌,%k获取第三个之后的所有其余令牌。
您还可以使用它来遍历目录,目录内容等。
而不是用REM或::行填充脚本,我在每个脚本的顶部执行以下操作:
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
请注意如何在不转义的情况下使用管道字符和重定向字符。
脚本所在的路径(带有驱动器):〜dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
已经提到了%〜dp0,但实际上还有更多内容:〜后面的字符定义了要提取的信息。
没有字母会导致返回补丁文件名称
d-返回驱动器字母
p-返回路径
s-返回短路径
x-返回文件扩展名
因此,如果从c:\ Temp执行以下脚本test.bat \长目录名\文件夹,
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
您得到以下输出
test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\
并且,如果像
测试c:\ temp \ mysrc \ test.cpp中那样将参数传递到脚本中,
则可以使用%1变量进行相同的操作。
但是%0扩展的结果取决于位置!
在批处理的“顶层”,它扩展为当前的批处理文件名。
在函数(调用)中,它扩展为函数名称。
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
输出为(批处理文件以myBatch.bat开头)
myBatch.bat
:test
:test
myBatch
通过使用CALL,EXIT / B,SETLOCAL和ENDLOCAL,您可以使用局部变量来实现子例程。
例:
@echo off
set x=xxxxx
call :sub 10
echo %x%
exit /b
:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b
这将打印
11
xxxxx
即使:sub修改x。
等待N秒(不属于cmd.exe的一部分,但由于Windows附带,它不是额外的软件)的狡猾trick俩,请参阅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
要隐藏命令的所有输出,请重定向到> nul 2>&1。
例如,即使您重定向到> nul,某些命令行程序也会显示输出。但是,如果您像下面的行一样重定向输出,则所有输出将被抑制。
PSKILL NOTEPAD >nul 2>&1
编辑:请参阅忽略命令的输出以获取有关其工作原理的说明。
taskkill
。
PAUSE
停止执行并显示以下提示:
按任意键继续 。。。
如果要通过在Windows资源管理器中双击批处理来运行批处理,并且希望实际看到输出而不只是命令窗口的闪烁,该命令很有用。
echo.|batch-with-pause.bat
与按“ any-key”具有相同的效果...
相当于bash(和其他shell)
echo -n Hello # or
echo Hello\\c
输出的是“ Hello
”,结尾没有换行符。一个cmd hack可以做到这一点:
<nul set /p any-variable-name=Hello
set /p
是一种提示用户输入的方法。它发出给定的字符串,然后(在同一行上,即没有CRLF)等待用户键入响应。
<nul
只需将空响应发送给 set /p
命令,那么最终结果就是发出的提示字符串。(由于响应为空,因此使用的变量保持不变。)
问题是:无法输出前导等号,并且在Vista上已删除了前导空白字符,但在XP上则不行。
您可以将if语句链接起来,以获得类似于短路布尔值“ and”的效果。
if foo if bar baz
if foo ( if bar ( baz ) )
想象一下括号后的换行符。)
if块结构:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
%ERRORLEVEL%
无论如何,你不应该使用伪变量;那if errorlevel <foo>
是为了什么。而这确实在这样的块实际上工作。
它并没有提供太多功能,但是您可以将title命令用于多种用途,例如在任务栏中的长脚本上提供状态,或者只是增强用户反馈。
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
字符串减法示例date
并time
获取名为“ YYYY-MM-DD HH:MM:SS.txt”的文件
echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"
我color
通过更改文本和背景的颜色来指示脚本是否成功,失败或需要一些输入。当您有一些机器可以看到但距离很远时,这确实有帮助
颜色XY
其中X和Y是从0
到的十六进制值F
,其中X-背景,Y-文本,当X = Y时颜色不变。
颜色Z
将文字颜色更改为“ Z”并设置黑色背景,“颜色0”将不起作用
用于颜色名称的呼叫
颜色?