Windows批处理文件有哪些不太为人所知,但很重要和有用的特性?

指南:

每个答案一个特征 给出特性的简短描述和示例,而不仅仅是文档链接 将答案限制在本地功能,即不需要额外的软件,如Windows资源包

澄清:这里我们指的是由cmd.exe处理的脚本,这是WinNT变体的默认值。

(请参见:Windows批处理文件:.bat vs .cmd?)


当前回答

为了从脚本内部解析stdin,你需要使用For和FIND命令:

for /f "tokens=*" %%g in ('find /V ""') do (
     :: do what you want with %%g
     echo %%g
)

其他回答

通过使用CALL, EXIT /B, SETLOCAL和ENDLOCAL可以实现带有局部变量的子例程。

例子:

@echo off

set x=xxxxx
call :sub 10
echo %x%
exit /b

:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b

这将打印

11
xxxxx

尽管:sub修改了x。

稍后可以使用call对名称求值,从而得到一些有用的属性。

call set SomeEnvVariable_%extension%=%%%somevalue%%%

使用调用来设置名称依赖于其他变量的变量。如果与某些变量命名规则一起使用,则可以通过使用谨慎的命名规则来模拟数组或字典等数据集合。somevalue周围的三个%是这样的,它将在调用之后和调用set之前计算为一个变量名,周围是一个%。这意味着一行中的两个%转义为一个%字符,然后它将再次展开它,因此somevalue实际上是一个名称指针。

call set TempVar=%%SomeEnvVariable_%extension%%%

将它与一个临时变量一起使用以检索值,然后可以在逻辑中使用该值。这在与延迟变量展开一起使用时非常有用。

要正确使用此方法,需要启用延迟变量扩展。因为它在默认情况下是关闭的,所以最好在脚本中启用它,将其作为第一个指令之一:

setlocal EnableDelayedExpansion

前面已经提到了%~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

允许您更改目录基于环境变量没有 必须指定'%'指令。如果指定的变量没有 存在,然后尝试目录名。

@if defined %1 (call cd "%%%1%%") else (call cd %1)

cmd.exe本身的/c参数,告诉它运行然后执行这些命令。

我曾经发现自己经常这样做:

win+r, cmd RETURN, ping google.com RETURN

但现在我只知道

win+r, cmd /c ping google.com返回

快得多。如果您正在使用pstools,并且希望使用psexec在远程机器上执行一些命令行功能,那么这也很有帮助。

EDIT: /k工作方式相同,但保持提示打开。这可能经常会派上用场。