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
30 回答
创建一个空文件:
逃离“管道”:
能够运行命令并处理输出(如bash中'$()'的反引号) .
如果文件名中有空格,请使用:
线路延续:
转到path指定的目录 .
带你回到你“推”的目录 .
不确定这在批处理文件中有多大用处,但在命令提示符下使用它是一个非常方便的命令:
这将在“some_directory”文件夹中打开Windows资源管理器 .
我发现这是一个很好的节省时间 .
我一直觉得很难阅读每行上用关键字标记的评论:
更易于阅读:
变量子串:
The FOR command!虽然我讨厌编写批处理文件,但我很感激 .
将解析myfile.txt中的每一行,忽略以分号开头的行,将第2和第3个标记从每行传递给for body,并用逗号和/或空格分隔标记 . 注意for body语句引用%i获取第二个标记,%j获取第三个标记,%k获取第3个标记之后的所有剩余标记 .
您也可以使用它来迭代目录,目录内容等...
我没有在REM或:: lines中乱丢脚本,而是在每个脚本的顶部执行以下操作:
请注意如何使用管道和重定向字符而不转义它们 .
脚本所在的路径(带驱动器):~dp0
已经提到了%~dp0片段,但实际上还有更多内容:〜之后的字符定义了提取的信息 .
返回补丁文件名时没有字母结果
d - 返回驱动器号
p - 返回路径
s - 返回短路径
x - 返回文件扩展名
因此,如果您从c:\ Temp \ long目录名\文件夹中执行下面的脚本test.bat,
你得到以下输出
如果参数传递到您的脚本中,请参阅
测试c:\ temp \ mysrc \ test.cpp
可以使用%1变量完成相同的操作 .
但是%0扩展的结果取决于位置!
在批次的"top level"处,它会扩展为当前批处理文件名 .
在函数(调用)中,它扩展为函数名称 .
输出是(批处理文件以myBatch.bat启动)
通过使用CALL,EXIT / B,SETLOCAL和ENDLOCAL,您可以使用局部变量实现子例程 .
例:
这将打印
即使:sub修改x .
偷偷摸摸的技巧等待N秒(不是cmd.exe的一部分,但因为它附带Windows而不是额外的软件),请参阅ping行 . 因为第一次ping没有延迟,你需要N 1 ping .
隐藏命令重定向到> nul 2>&1的所有输出 .
例如,即使您重定向到> nul,某些命令行程序也会显示输出 . 但是,如果您将输出重定向到下面的行,则所有输出都将被抑制 .
编辑:有关其工作原理的说明,请参阅Ignoring the output of a command .
停止执行并显示以下提示:
如果您想通过在Windows资源管理器中双击它来运行批处理并希望实际看到输出而不仅仅是命令窗口的闪存,则非常有用 .
相当于bash(和其他shell)
输出“
Hello
”而没有尾随换行符 . 一个cmd hack来做到这一点:set /p
是一种提示用户输入的方法 . 它发出给定的字符串,然后等待(在同一行,即没有CRLF),以便用户键入响应 .<nul
只是管道对set /p
命令的空响应,所以最终结果是发出的提示字符串 . (由于空的响应,使用的变量保持不变 . )问题是:输出一个前导等号是不可能的,并且在Vista上领先的空白字符被删除,但不是在XP上 .
设置环境变量时搜索和替换:
...从用于时间戳文件名的日期中删除“/” .
和子串...
整数算术:
命令分隔符:
在第二行,&&仅在第一个命令成功时运行 .
在第3行,||之后的命令仅在第一个命令失败时运行 .
输出一个空行:
您可以链接if语句以获得类似短路布尔“和”的效果 .
快速将Unicode文本文件(16位/字符)转换为ASCII DOS文件(8位/字符) .
作为奖励,如果可能,正确映射字符 .
如果块结构:
变量的延迟扩展(带有子串以便进行测量):
不提供太多功能,但您可以将title命令用于几个用途,例如在任务栏中的长脚本上提供状态,或者只是为了增强用户反馈 .
没有编辑器方便,需要创建批处理文件?
只需键入命令,按Enter键即可获得新行 . 按Ctrl-Z和Enter关闭文件 .
date
和time
上的字符串减法示例,以获取名为"YYYY-MM-DD HH:MM:SS.txt"的文件我使用
color
来指示我的脚本是否成功,失败或需要通过更改文本和背景的颜色来输入 . 当你有一台机器可以看到你的视线但距离很远时,这确实很有帮助其中X和Y是从
0
到F
的十六进制值,其中X - 背景,Y - 文本,当X = Y颜色时不会改变 .将文本颜色更改为“Z”并设置黑色背景,“颜色0”将不起作用
用于调用颜色的名称
使用间距和转义字符对输出进行完全控制:
TheSoftwareJedi已经提到了for命令,但是我会再次提到它,因为它非常强大 .
以下以YYYYMMDD格式输出当前日期,我在生成备份目录时使用它 .