Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
当前回答
子例程(输出42):
@echo off
call :answer 42
goto :eof
:do_something
echo %1
goto :eof
子例程返回一个值(输出0、1、2,等等):
@echo off
setlocal enableextensions enabledelayedexpansion
call :seq_init seq1
:loop1
if not %seq1%== 10 (
call :seq_next seq1
echo !seq1!
goto :loop1
)
endlocal
goto :eof
:seq_init
set /a "%1 = -1"
goto :eof
:seq_next
set /a "seq_next_tmp1 = %1"
set /a "%1 = %seq_next_tmp1% + 1"
set seq_next_tmp1=
goto :eof
其他回答
FIND作为grep的替代品。 我用find给自己黑了个电话簿。非常有用:
@echo off
:begin
set /p term=Enter query:
type phonebookfile.txt |find /i "%term%"
if %errorlevel% == 0 GOTO :choose
echo No entry found
set /p new_entry=Add new entry:
echo %new_entry% >> phonebookfile.txt
:choose
set /p action=(q)uit, (n)ew query or (e)dit? [q]
if "%action%"=="n" GOTO anfang
if "%action%"=="e" (
notepad phonebookfile.txt
goto :choose
)
非常快速有效。
去:eof纸板
我在脚本的末尾添加了“goto:eof”,作为存放代码片段的方便空间。这样我就可以快速复制/粘贴到这个区域,而不需要注释/取消注释。
goto :eof
:: code scraps
call this.bat
call that.bat
set TS=%DATE:~10%%DATE:~4,2%%DATE:~7,2%-%TIME:~0,2%%TIME:~3,2%%TIME:~6%%
for /R C:\temp\ %%G in (*.bak) DO del %%G
搜索路径上的可执行文件(或其他类似路径的字符串,如果需要):
c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe
c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe
c:\>
前面已经提到了%~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\长目录名\ c:\Temp\长目录名\ 。bat c: \ Temp \ \ test.bat LONGDI ~ 1 1 \ \ Temp \ LONGDI ~
如果一个参数被传递到你的脚本中 测试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
dos命令宏。
我已经很久没有参考过这一点了,但我仍然认为这是一个好主意,值得分享。
我们可以将批处理文件和doskey脚本合并到一个文件中。这可能看起来有点过于聪明,但它确实有效。
;= @echo off
;= rem Call DOSKEY and use this file as the macrofile
;= %SystemRoot%\system32\doskey /listsize=1000 /macrofile=%0%
;= rem In batch mode, jump to the end of the file
;= goto end
;= Doskey aliases
h=doskey /history
;= File listing enhancements
ls=dir /x $*
;= Directory navigation
up=cd ..
pd=pushd
;= :end
;= rem ******************************************************************
;= rem * EOF - Don't remove the following line. It clears out the ';'
;= rem * macro. Were using it because there is no support for comments
;= rem * in a DOSKEY macro file.
;= rem ******************************************************************
;=
它通过定义一个假的doskey宏';'来工作,当它被解释为批处理文件时,它会被优雅地(或无声地)忽略。
我缩短了这里列出的版本,如果你想要更多,请点击这里。