Windows批处理文件中一些不太为人所知,但重要且有用的特性是什么?
指南:
- 每个答案只涉及一个特性
- 提供特性的简短描述和示例,而不是只提供文档链接
- 答案限于本地功能,即不需要其他软件,如Windows资源工具包
澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(另请参见:Windows批处理文件:.bat与.cmd有何区别?)
Windows批处理文件中一些不太为人所知,但重要且有用的特性是什么?
指南:
澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(另请参见:Windows批处理文件:.bat与.cmd有何区别?)
行继续:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
PUSHD path
将您带到指定的目录 path。
POPD
返回你之前“push”命令所在的目录。
cd
命令不同的是,您也可以使用pushd
在不同驱动器之间切换目录。 (如果您在C:\ Windows中,并且想要进入D:\ Games,则pushd D:\ Games
将带您到那里,而无需键入D:
和cd D:\ Games
。) - idbrii不确定在批处理文件中这会有多大用处,但在命令提示符中使用这个命令非常方便:
不确定在批处理文件中这会有多大用处,但在命令提示符中使用这个命令非常方便:
C:\some_directory> start .
这将在“some_directory”文件夹中打开Windows资源管理器。
我发现这是一个非常省时的方法。
open .
也可以实现同样的功能。 - Grant Paulstart
做的不仅仅是打开当前文件夹。你可以传递任何文件给它,它会使用配置的查看器打开它。如果给它一个 URL,你的默认浏览器就会打开它,等等... - idbriiexplorer
命令后面加了句号(“.
”)吗?它需要这个来打开当前目录。C:\some_directory>explorer .
- Ray我一直觉得阅读每行都用关键词标记的注释很困难:
REM blah blah blah
更易读:
:: blah blah blah
rem
是一个已记录的关键字,而::
只是一种实现细节。虽然::
停止工作的可能性很小,但通常建议不要依赖未记录的行为。 - Joeygoto:
跳转到标签。使用 :-)
和 goto -)
同样也有效。 - Sven Marnach变量子字符串:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
for%a in ...
)组合使用,因为它们不需要像环境变量一样需要关闭百分号;您必须首先将它们分配给环境变量(使用延迟扩展!),然后提取子字符串。 - RolKauFOR命令!虽然我不喜欢写批处理文件,但我还是感激它。
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
would parse each line in myfile.txt, ignoring lines that begin with a semicolon, passing the 2nd and 3rd token from each line to the for body, with tokens delimited by commas and/or spaces. Notice the for body statements reference %i to get the 2nd token, %j to get the 3rd token, and %k to get all remaining tokens after the 3rd.
您可以使用此方法迭代目录、目录内容等等...
我不会在脚本中乱用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%
cd /d "%BAT_HOME%"
。 - MikeOnline%~dp0 这个变量之前已经提到过了,但实际上它还有更多的用法:
在 ~ 后面加上一个或多个字符,就可以提取不同的信息。
如果没有任何字符,则返回批处理文件的路径和名称。
d - 返回驱动器号。
p - 返回路径。
s - 返回短路径名。
x - 返回文件扩展名。
因此,如果你从 c:\Temp\long dir name\ 文件夹中执行下面的 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\
如果将参数传递到您的脚本中,例如
test 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。
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 /?
即可。 - Kurt Pfeifle