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

指南:

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

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

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


当前回答

CHOICE命令提示用户在多个选项中选择一个(通过单个按键)

@echo off
echo Please choose one of the following options
echo 1. Apple
echo 2. Orange
echo 3. Pizza
echo a, b, c. Something else
choice /c:123abc /m "Answer?"
set ChoiceLevel=%ErrorLevel%
echo Choice was: %ChoiceLevel%

%ChoiceLevel%将是选中的第n个选项(在上面的例子中,b=5)。

更多详情请访问SS64.com上的CHOICE参考页面。

其他回答

变量的延迟展开(为了更好地度量,还加入了子字符串):

    @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

无论如何,这是一个很好的Windows CMD或批处理文件的在线参考。我学到了一些我不知道的东西。

搜索路径上的可执行文件(或其他类似路径的字符串,如果需要):

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:\>

递归搜索目录树中的字符串:

findstr /S /C:"string literal" *.*

你也可以使用正则表达式:

findstr /S /R "^ERROR" *.log

递归文件搜索:

dir /S myfile.txt

子例程(输出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