Windowsbatch file的隐藏function
什么是Windowsbatch file的一些不太了解,但重要和有用的function?
指南:
- 每个答案一个function
- 同时提供该function和示例的简短说明 ,而不仅仅是文档链接
- 限制原生function的答案,即不需要额外的软件,如Windows资源工具包
说明:我们在这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(另请参阅: Windowsbatch file:.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 
让你回到你“推”的目录。
不知道在批处理文件中这是多么有用,但是在命令提示符下使用它是一个非常方便的命令:
 C:\some_directory> start . 
这将打开“some_directory”文件夹中的Windows资源pipe理器。
我发现这是一个很好的节省时间。
我一直觉得很难阅读每行上用关键字标注的注释:
 REM blah blah blah 
更容易阅读:
 :: blah blah blah 
可变子串:
 > set str=0123456789 > echo %str:~0,5% 01234 > echo %str:~-5,5% 56789 > echo %str:~3,-3% 3456 
FOR命令 ! 虽然我讨厌编写batch file,但我很感激。
 FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 
会parsingmyfile.txt中的每一行,忽略以分号开头的行,将每行的第二个和第三个标记传递给for体,并用逗号和/或空格分隔标记。 请注意,对于body语句,请参阅%i获取第二个标记,%j获取第三个标记,并使用%k获取第三个标记之后的所有剩余标记。
你也可以使用它遍历目录,目录内容等等。
用REM或者:: lines代替乱七八糟的脚本,我会在每个脚本的顶部执行以下操作:
 @echo OFF goto :START Description of the script. Usage: myscript -parm1|parm2 > result.txt :START 
请注意,如何使用pipe道和redirect字符而不用转义字符。
脚本所在的path(带驱动器):〜dp0
 set BAT_HOME=%~dp0 echo %BAT_HOME% cd %BAT_HOME% 
 已经提到了%〜dp0这个片断,但实际上还有更多的内容:在定义提取的信息之后的字符。 
 没有字母导致补丁文件名称的返回 
  d  – 返回驱动器号 
  p  – 返回path 
  s  – 返回短path 
  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\
 如果一个参数被传入你的脚本, 
 testingc:\ temp \ mysrc \ test.cpp 
 可以用%1variables完成相同的操作。 
 但%0扩展的结果取决于位置! 
 在批次的“顶层”,它扩展到当前的batch file名称。 
 在一个函数(call)中,它扩展到函数名称。 
 @echo off echo %0 call :test goto :eof :test echo %0 echo %~0 echo %~n0 
输出是(batch file是用myBatch.bat开始的)
 myBatch.bat :test :test myBatch 
通过使用CALL,EXIT / B,SETLOCAL&ENDLOCAL,你可以使用局部variables来实现子程序。
例:
 @echo off set x=xxxxx call :sub 10 echo %x% exit /b :sub setlocal set /ax=%1 + 1 echo %x% endlocal exit /b 
这将打印
 11 xxxxx 
即使:子修改x。
鬼鬼祟祟的等待N秒(不是cmd.exe的一部分,但不是因为Windows自带的额外软件),请参阅ping线。 自从第一次ping出来以后,你需要N + 1个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 
逃避“pipe道”:
 echo ^| ^< ^> ^& ^\ ^^ 
能够运行命令并处理输出(如bash中的'$()'的反引号)。
 for /f %i in ('dir /on /b *.jpg') do echo --^> %i 
如果文件名中有空格,请使用以下命令:
 for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i 
创build一个空文件:
 > copy nul filename.ext 
要将命令的所有输出redirect到> nul 2>&1。
例如,即使您redirect到> nul,一些命令行程序也会显示输出。 但是,如果将输出redirect到下面的行,所有输出将被抑制。
 PSKILL NOTEPAD >nul 2>&1 
编辑:请参阅忽略命令的输出,以解释这是如何工作的。
 PAUSE 
停止执行并显示以下提示:
按任意键继续 。 。 。
如果你想通过在Windows资源pipe理器中双击来运行一个批处理,而且希望实际看到输出,而不仅仅是命令窗口的一个闪存,那么这很有用。
相当于bash(和其他的shell)
 echo -n Hello # or echo Hello\\c 
 输出“ Hello ”而没有结尾的换行符。 一个cmd hack来做到这一点: 
 <nul set /p any-variable-name=Hello 
  set /p是一种提示用户input的方法。 它发出给定的string,然后等待(在同一行上,即没有CRLF),供用户键入一个响应。 
  <nul只是简单地将一个空的响应传给set /p命令,所以最终的结果是发出的提示string。  (由于空的响应,使用的variables保持不变。) 
问题是:输出一个前导等号是不可能的,而在Vista上,前导空白字符被删除,而不是在XP上。
设置环境variables时search和replace:
 > @set fname=%date:/=% 
…从时间戳文件名中使用的date中删除“/”。
子串也是…
 > @set dayofweek=%fname:~0,3% 
整数算术:
 > SET /A result=10/3 + 1 4 
命令分隔符:
 cls & dir copy ab && echo Success copy ab || echo Failure 
在第二行,&&后面的命令只有在第一个命令成功时才会运行。
在第三行,||之后的命令 只有在第一个命令失败时才会运行。
输出一个空行:
 echo. 
你可以链接如果语句来获得像短路布尔`和'的效果。
 if foo if bar baz 
快速将Unicode文本文件(16位/字符)转换为ASCII DOS文件(8位/字符)。
 C:\> type unicodeencoded.txt > dosencoded.txt 
作为奖励,如果可能的话,字符被正确映射。
如果块结构:
 if "%VS90COMNTOOLS%"=="" ( echo: Visual Studio 2008 is not installed exit /b ) 
延迟的variables扩展(带有子string以提高度量):
  @echo off setlocal enableextensions enabledelayedexpansion set full=/u01/users/pax :loop1 if not "!full:~-1!" == "/" ( set full2=!full:~-1!!full2! set full=!full:~,-1! goto :loop1 ) echo !full! endlocal 
不提供太多的function,但是您可以使用title命令进行一些用途,例如在任务栏中的长脚本上提供状态,或仅用于增强用户反馈。
 @title Searching for ... :: processing search @title preparing search results :: data processing 
没有一个编辑器方便,需要创build一个batch file?
 copy con test.bat 
只需input命令,按Enter键换行。 按下Ctrl-Z和Enter键closures文件。
 以date和timestring减法命名为“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来指示脚本是否成功完成,失败,或者需要通过改变文本和背景的颜色来进行input。 当你有一些机器到达你的视野,但相当遥远的时候,它确实有帮助 
颜色XY
 其中X和Y是从0到Fhex值,其中X  – 背景,Y  – 文本,当X = Y时颜色不会改变。 
颜色Z
将文字颜色更改为“Z”并设置黑色背景,“颜色0”将不起作用
为颜色名称呼叫
颜色?
用间距和转义字符对输出进行总体控制
 echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^> 
TheSoftwareJedi已经提到了for命令,但是我会再次提到它,因为它非常强大。
以下以YYYYMMDD格式输出当前date,我在生成备份目录时使用此date。
 for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a