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
和time
string减法命名为“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
到F
hex值,其中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