Windows批处理文件的隐藏功能
Windows批处理文件的一些鲜为人知但重要且有用的功能是什么 准则:Windows批处理文件的隐藏功能,windows,batch-file,hidden-features,Windows,Batch File,Hidden Features,Windows批处理文件的一些鲜为人知但重要且有用的功能是什么 准则: 每个答案一个功能 提供功能的简短描述和示例,而不仅仅是文档链接 将答案限制为本机功能,即不需要额外的软件,如Windows资源工具包 澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认脚本 (另请参见:)我总是发现很难阅读每行上都标有关键字的评论: REM blah blah blah 易于阅读: :: blah blah blah 脚本所在的路径(带驱动器):~dp0 set BAT_HOME
- 每个答案一个功能
- 提供功能的简短描述和示例,而不仅仅是文档链接
- 将答案限制为本机功能,即不需要额外的软件,如Windows资源工具包
(另请参见:)我总是发现很难阅读每行上都标有关键字的评论:
REM blah blah blah
易于阅读:
:: blah blah blah
脚本所在的路径(带驱动器):~dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
可变子字符串:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
将您带到路径指定的目录
将您带回“推送”的目录。!虽然我讨厌编写批处理文件,但我还是很感激它
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
将解析myfile.txt中的每一行,忽略以分号开头的行,将每一行的第二个和第三个标记传递给for主体,标记由逗号和/或空格分隔。
请注意,for body语句引用%i获取第二个令牌,%j获取第三个令牌,%k获取第三个令牌之后的所有剩余令牌
您还可以使用它来迭代目录、目录内容等。整数算法:
> SET /A result=10/3 + 1
4
创建空文件:
> copy nul filename.ext
通过使用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
PAUSE
停止执行并显示以下提示:
Press any key to continue . . .
按任意键继续。
如果您希望在Windows资源管理器中双击批处理来运行批处理,并希望实际查看输出,而不仅仅是命令窗口的闪烁,则此功能非常有用。使用空格和转义字符对输出进行完全控制:
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
echo.^/%basedir%/资源^
行继续:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
变量的延迟扩展(为了更好地度量,引入了子字符串):
鬼鬼祟祟的等待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
输出一个空行:
echo.
能够运行命令并处理输出(如bash中“$()”的倒勾) 如果文件名中有空格,请使用:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
将Unicode文本文件(16位/字符)快速转换为ASCII DOS文件(8位/字符)
另外,如果可能的话,可以正确映射字符。不确定这在批处理文件中有多有用,但在命令提示符中使用这是一个非常方便的命令:
C:\some_directory> start .
这将打开“some_目录”文件夹中的Windows资源管理器
我发现这非常节省时间。如果块结构:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
softwarejedi已经提到了for命令,但是我将再次提到它,因为它非常强大 下面以YYYYMMDD格式输出当前日期,我在生成备份目录时使用此格式
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
要隐藏命令的所有输出,请重定向到>nul 2>&1 例如,即使重定向到>nul,某些命令行程序也会显示输出。但是,如果像下面的行一样重定向输出,则所有输出都将被抑制
PSKILL NOTEPAD >nul 2>&1
编辑:有关如何工作的解释,请参阅。您可以链接if语句以获得类似短路布尔“and”的效果
if foo if bar baz
在
日期
和时间
上进行字符串减法以获取名为“YYYY-MM-DD HH:MM:SS.txt”的文件的示例
echo test>%date:~0,4%-%date:~5,2%-%date:~8,2%%时间:~0,2%\%time:~3,2%\%time:~6,2%.txt
我使用color
来指示脚本是否成功、失败,或者是否需要通过更改文本和背景的颜色来进行输入。当你有一台机器在你视线范围内,但离你很远的时候,它真的很有帮助
彩色XY
其中X和Y是从0
到F
的十六进制值,其中X-背景,Y-文本,当X=Y颜色不变时
颜色Z
将文本颜色更改为“Z”并设置黑色背景,“颜色0”将不起作用
有关颜色名称,请致电
颜色
设置环境变量时搜索和替换:
> @set fname=%date:/=%
…从日期中删除“/”以用于带时间戳的文件名
还有子字符串
> @set dayofweek=%fname:~0,3%
逃离“管道”:
echo^^^<^>^&^^^
与其在脚本中乱扔REM或::行,不如在每个脚本的顶部执行以下操作:
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
请注意如何在不转义的情况下使用管道和重定向字符。没有提供太多功能,但可以将title命令用于多种用途,例如在任务栏中提供长脚本的状态,或者只是为了增强用户反馈
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
命令分隔符:
cls & dir
copy a b && echo Success
copy a b || echo Failure
在第2行,&&之后的命令仅在第一个命令成功时运行
在第三行,| |之后的命令仅在第一个命令失败时运行。相当于bash(和其他shell) 输出“
Hello
”而不带尾随换行符。要做到这一点,可以使用cmd hack:
<nul set /p any-variable-name=Hello
已经提到了%%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
您将获得以下输出
如果一个参数像
测试c:\temp\mysrc\test.cpp
可以对%1变量执行相同的操作
但是%0的扩展结果取决于位置
在t的“顶层”
echo ^| ^< ^> ^& ^\ ^^
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
cls & dir
copy a b && echo Success
copy a b || echo Failure
echo -n Hello # or
echo Hello\\c
<nul set /p any-variable-name=Hello
@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\
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
myBatch.bat
:test
:test
myBatch
copy con test.bat