Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件的隐藏功能_Windows_Batch File_Hidden Features - Fatal编程技术网

Windows批处理文件的隐藏功能

Windows批处理文件的隐藏功能,windows,batch-file,hidden-features,Windows,Batch File,Hidden Features,Windows批处理文件的一些鲜为人知但重要且有用的功能是什么 准则: 每个答案一个功能 提供功能的简短描述和示例,而不仅仅是文档链接 将答案限制为本机功能,即不需要额外的软件,如Windows资源工具包 澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认脚本 (另请参见:)我总是发现很难阅读每行上都标有关键字的评论: REM blah blah blah 易于阅读: :: blah blah blah 脚本所在的路径(带驱动器):~dp0 set BAT_HOME

Windows批处理文件的一些鲜为人知但重要且有用的功能是什么

准则:

  • 每个答案一个功能
  • 提供功能的简短描述和示例,而不仅仅是文档链接
  • 将答案限制为本机功能,即不需要额外的软件,如Windows资源工具包
澄清:我们这里指的是由cmd.exe处理的脚本,这是WinNT变体的默认脚本


(另请参见:)

我总是发现很难阅读每行上都标有关键字的评论:

REM blah blah blah
易于阅读:

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

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
可变子字符串:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
将您带到路径指定的目录

将您带回“推送”的目录。

!虽然我讨厌编写批处理文件,但我还是很感激它

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
将解析myfile.txt中的每一行,忽略以分号开头的行,将每一行的第二个和第三个标记传递给for主体,标记由逗号和/或空格分隔。 请注意,for body语句引用%i获取第二个令牌,%j获取第三个令牌,%k获取第三个令牌之后的所有剩余令牌

您还可以使用它来迭代目录、目录内容等。

整数算法:

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

创建空文件:

> copy nul filename.ext

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

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

Press any key to continue . . . 按任意键继续。
如果您希望在Windows资源管理器中双击批处理来运行批处理,并希望实际查看输出,而不仅仅是命令窗口的闪烁,则此功能非常有用。

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

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
echo.^/%basedir%/资源^
行继续:

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

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


鬼鬼祟祟的等待N秒的技巧(不是cmd.exe的一部分,但不是额外的软件,因为它与Windows一起提供),请参阅ping行。您需要N+1次ping,因为第一次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
输出一个空行:

echo.

能够运行命令并处理输出(如bash中“$()”的倒勾)

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

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

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


另外,如果可能的话,可以正确映射字符。

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

C:\some_directory> start .
这将打开“some_目录”文件夹中的Windows资源管理器

我发现这非常节省时间。

如果块结构:

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

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

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

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

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

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

PSKILL NOTEPAD >nul 2>&1

编辑:有关如何工作的解释,请参阅。

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

if foo if bar baz

日期
时间
上进行字符串减法以获取名为“YYYY-MM-DD HH:MM:SS.txt”的文件的示例

echo test>%date:~0,4%-%date:~5,2%-%date:~8,2%%时间:~0,2%\%time:~3,2%\%time:~6,2%.txt

我使用
color
来指示脚本是否成功、失败,或者是否需要通过更改文本和背景的颜色来进行输入。当你有一台机器在你视线范围内,但离你很远的时候,它真的很有帮助

彩色XY

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

颜色Z

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

有关颜色名称,请致电

颜色


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

> @set fname=%date:/=%
…从日期中删除“/”以用于带时间戳的文件名

还有子字符串

> @set dayofweek=%fname:~0,3%
逃离“管道”:

echo^^^<^>^&^^^

与其在脚本中乱扔REM或::行,不如在每个脚本的顶部执行以下操作:

@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START

请注意如何在不转义的情况下使用管道和重定向字符。

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

@title Searching for ...
:: processing search
@title preparing search results
:: data processing
命令分隔符:

cls & dir
copy a b && echo Success
copy a b || echo Failure
在第2行,&&之后的命令仅在第一个命令成功时运行


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

相当于bash(和其他shell)

输出“
Hello
”而不带尾随换行符。要做到这一点,可以使用cmd hack:

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

已经提到了%%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\mysrc\test.cpp
可以对%1变量执行相同的操作

但是%0的扩展结果取决于位置
在t的“顶层”
echo ^| ^< ^> ^& ^\ ^^
@echo OFF
goto :START

Description of the script.

Usage:
   myscript -parm1|parm2 > result.txt

:START
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
cls & dir
copy a b && echo Success
copy a b || echo Failure
echo -n Hello # or
echo Hello\\c
<nul set /p any-variable-name=Hello
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
test
c:
\Temp\long dir name\
c:\Temp\long dir name\
.bat
c:\Temp\LONGDI~1\test.bat
\Temp\LONGDI~1\
@echo off
echo %0
call :test
goto :eof

:test
echo %0
echo %~0
echo %~n0
myBatch.bat
:test
:test
myBatch
copy con test.bat