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文件。

datetimestring减法命名为“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是从0Fhex值,其中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