首页 文章

Windows批处理文件的隐藏功能

提问于
浏览
232

Windows批处理文件有哪些鲜为人知但又重要且有用的功能?

指南:

  • 每个答案一个功能

  • 同时提供该功能的简短 descriptionexample ,而不仅仅是文档的链接

  • 限制 native funtionality 的答案,即不需要其他软件,如Windows资源工具包

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

(另见:Windows batch files: .bat vs .cmd?

30 回答

  • 15

    创建一个空文件:

    > copy nul filename.ext
    
  • 12

    逃离“管道”:

    echo ^| ^< ^> ^& ^\ ^^
    
  • 42

    能够运行命令并处理输出(如bash中'$()'的反引号) .

    for /f %i in ('dir /on /b *.jpg') do echo --^> %i
    

    如果文件名中有空格,请使用:

    for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
    
  • 87

    线路延续:

    call C:\WINDOWS\system32\ntbackup.exe ^
        backup ^
        /V:yes ^
        /R:no ^
        /RS:no ^
        /HC:off ^
        /M normal ^
        /L:s ^
        @daily.bks ^
        /F daily.bkf
    
  • 54
    PUSHD path
    

    转到path指定的目录 .

    POPD
    

    带你回到你“推”的目录 .

  • 79

    不确定这在批处理文件中有多大用处,但在命令提示符下使用它是一个非常方便的命令:

    C:\some_directory> start .
    

    这将在“some_directory”文件夹中打开Windows资源管理器 .

    我发现这是一个很好的节省时间 .

  • 150

    我一直觉得很难阅读每行上用关键字标记的评论:

    REM blah blah blah
    

    更易于阅读:

    :: blah blah blah
    
  • 72

    变量子串:

    > set str=0123456789
    > echo %str:~0,5%
    01234
    > echo %str:~-5,5%
    56789
    > echo %str:~3,-3%
    3456
    
  • 17

    The FOR command!虽然我讨厌编写批处理文件,但我很感激 .

    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
    

    将解析myfile.txt中的每一行,忽略以分号开头的行,将第2和第3个标记从每行传递给for body,并用逗号和/或空格分隔标记 . 注意for body语句引用%i获取第二个标记,%j获取第三个标记,%k获取第3个标记之后的所有剩余标记 .

    您也可以使用它来迭代目录,目录内容等...

  • 30

    我没有在REM或:: lines中乱丢脚本,而是在每个脚本的顶部执行以下操作:

    @echo OFF
    goto :START
    
    Description of the script.
    
    Usage:
       myscript -parm1|parm2 > result.txt
    
    :START
    

    请注意如何使用管道和重定向字符而不转义它们 .

  • 43

    脚本所在的路径(带驱动器):~dp0

    set BAT_HOME=%~dp0
    echo %BAT_HOME%
    cd %BAT_HOME%
    
  • 25

    已经提到了%~dp0片段,但实际上还有更多内容:〜之后的字符定义了提取的信息 .
    返回补丁文件名时没有字母结果
    d - 返回驱动器号
    p - 返回路径
    s - 返回短路径
    x - 返回文件扩展名
    因此,如果您从c:\ Temp \ long目录名\文件夹中执行下面的脚本test.bat,

    @echo off
    echo %0
    echo %~d0
    echo %~p0
    echo %~dp0
    echo %~x0
    echo %~s0
    echo %~sp0
    

    你得到以下输出

    测试
    C:
    \ Temp \ long dir name
    c:\ Temp \ long dir name
    . 蝙蝠
    C:\ TEMP \帝〜1个\ test.bat的
    \ TEMP \帝〜1 \

    如果参数传递到您的脚本中,请参阅
    测试c:\ temp \ mysrc \ test.cpp
    可以使用%1变量完成相同的操作 .

    但是%0扩展的结果取决于位置!
    在批次的"top level"处,它会扩展为当前批处理文件名 .
    在函数(调用)中,它扩展为函数名称 .

    @echo off
    echo %0
    call :test
    goto :eof
    
    :test
    echo %0
    echo %~0
    echo %~n0
    

    输出是(批处理文件以myBatch.bat启动)

    myBatch.bat
    :test
    :test
    myBatch
    
  • 10

    通过使用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 .

  • 185

    偷偷摸摸的技巧等待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
    
  • 31

    隐藏命令重定向到> nul 2>&1的所有输出 .

    例如,即使您重定向到> nul,某些命令行程序也会显示输出 . 但是,如果您将输出重定向到下面的行,则所有输出都将被抑制 .

    PSKILL NOTEPAD >nul 2>&1
    

    编辑:有关其工作原理的说明,请参阅Ignoring the output of a command .

  • 14
    PAUSE
    

    停止执行并显示以下提示:

    Press any key to continue . . .
    

    如果您想通过在Windows资源管理器中双击它来运行批处理并希望实际看到输出而不仅仅是命令窗口的闪存,则非常有用 .

  • 109

    相当于bash(和其他shell)

    echo -n Hello # or
    echo Hello\\c
    

    输出“ Hello ”而没有尾随换行符 . 一个cmd hack来做到这一点:

    <nul set /p any-variable-name=Hello
    

    set /p 是一种提示用户输入的方法 . 它发出给定的字符串,然后等待(在同一行,即没有CRLF),以便用户键入响应 .

    <nul 只是管道对 set /p 命令的空响应,所以最终结果是发出的提示字符串 . (由于空的响应,使用的变量保持不变 . )

    问题是:输出一个前导等号是不可能的,并且在Vista上领先的空白字符被删除,但不是在XP上 .

  • 14

    设置环境变量时搜索和替换:

    > @set fname=%date:/=%
    

    ...从用于时间戳文件名的日期中删除“/” .

    和子串...

    > @set dayofweek=%fname:~0,3%
    
  • 9

    整数算术:

    > SET /A result=10/3 + 1
    4
    
  • 28

    命令分隔符:

    cls & dir
    copy a b && echo Success
    copy a b || echo Failure
    

    在第二行,&&仅在第一个命令成功时运行 .

    在第3行,||之后的命令仅在第一个命令失败时运行 .

  • 15

    输出一个空行:

    echo.
    
  • 11

    您可以链接if语句以获得类似短路布尔“和”的效果 .

    if foo if bar baz
    
  • 18

    快速将Unicode文本文件(16位/字符)转换为ASCII DOS文件(8位/字符) .

    C:\> type unicodeencoded.txt > dosencoded.txt
    

    作为奖励,如果可能,正确映射字符 .

  • 37

    如果块结构:

    if "%VS90COMNTOOLS%"=="" (
      echo: Visual Studio 2008 is not installed
      exit /b
    )
    
  • 60

    变量的延迟扩展(带有子串以便进行测量):

    @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
    
  • 12

    不提供太多功能,但您可以将title命令用于几个用途,例如在任务栏中的长脚本上提供状态,或者只是为了增强用户反馈 .

    @title Searching for ...
    :: processing search
    @title preparing search results
    :: data processing
    
  • 16

    没有编辑器方便,需要创建批处理文件?

    copy con test.bat
    

    只需键入命令,按Enter键即可获得新行 . 按Ctrl-Z和Enter关闭文件 .

  • 25

    datetime 上的字符串减法示例,以获取名为"YYYY-MM-DD HH:MM:SS.txt"的文件

    回声测试>“%date:~0,4% - %date:~5,2% - %date:~8,2 %% time:~0.2%%time:~3,2%%时间:〜6.2%的.txt”

    我使用 color 来指示我的脚本是否成功,失败或需要通过更改文本和背景的颜色来输入 . 当你有一台机器可以看到你的视线但距离很远时,这确实很有帮助

    颜色XY

    其中X和Y是从 0F 的十六进制值,其中X - 背景,Y - 文本,当X = Y颜色时不会改变 .

    颜色Z.

    将文本颜色更改为“Z”并设置黑色背景,“颜色0”将不起作用

    用于调用颜色的名称

    颜色?

  • 49

    使用间距和转义字符对输出进行完全控制:

    echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
    
  • 11

    TheSoftwareJedi已经提到了for命令,但是我会再次提到它,因为它非常强大 .

    以下以YYYYMMDD格式输出当前日期,我在生成备份目录时使用它 .

    for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a
    

相关问题