Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?
指南:
每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包
澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。
(请参见:Windows批处理文件:.bat vs .cmd?)
当前回答
当你想在分支之间复制文件时,一个方便的技巧:
C:\src\branch1\mydir\mydir2\mydir3\mydir4>xcopy %cd:branch1=branch2%\foo*
Overwrite C:\src\branch1\mydir\mydir2\mydir3\mydir4\foo.txt (Yes/No/All)? y
C:\src\branch2\mydir\mydir2\mydir3\mydir4\foo.txt
这既使用了%cd%环境变量,也使用了环境变量替换。
其他回答
子例程(输出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
变量的延迟展开(为了更好地度量,还加入了子字符串):
@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
设置环境变量时的搜索和替换:
> @set fname=%date:/=%
...从日期中删除“/”以用于带时间戳的文件名。
还有子字符串……
> @set dayofweek=%fname:~0,3%
我真的很喜欢这个Windows XP命令参考,以及在顶部的语法链接;它涵盖了许多已经在其他答案中找到的技巧和技巧。
在脚本中使用命令扩展shell选项时,强烈建议您在脚本开始时执行以下技巧。
——从http://www.ss64.com/nt/setlocal.html粘贴的信息
如果给定一个参数,SETLOCAL将设置一个ERRORLEVEL。如果给出两个有效参数中的一个,它将为0,否则为1。 你可以在批处理文件中使用它来确定命令扩展名是否可用,使用以下技术:
VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions
这是因为“VERIFY errors”将ERRORLEVEL设置为1,然后如果扩展不可用(例如,如果脚本在command.com下运行),SETLOCAL将无法重置ERRORLEVEL值。 如果命令扩展被永久禁用,那么SETLOCAL ENABLEEXTENSIONS将不会恢复它们。