在开发中双击批处理文件并不是一个好主意,因为这会导致启动
%SystemRoot%\System32\cmd.exe /c "batch file name with full path and extension"
因为它可以在运行时读取cmd /?
在命令提示符窗口中,该选项/C
means close命令进程及其控制台窗口在命令、可执行文件或脚本执行完成后立即完成,与结束执行的原因无关。
为了在开发中调试批处理文件,最好
- 打开命令提示符窗口,
- 使用命令更改当前目录CD到批处理文件的目录和
- run the batch file by typing its name and hitting key RETURN or ENTER.
对于应独立于当前目录所在目录工作的批处理文件,建议忽略第 2 点并运行批处理文件,输入其完整路径、文件名和文件扩展名(用双引号引起来),并且当前目录不是所在目录批处理文件。
从命令提示符窗口中执行批处理文件:
%SystemRoot%\System32\cmd.exe /K BatchFileNameAsTyped
选项/K
means keep命令进程正在运行,这导致在执行命令/可执行文件/脚本后命令提示符窗口保持打开状态,从而可以读取错误消息。
The keys UP ARROW and DOWN ARROW can be used to reload command lines once entered in command prompt window making it easy to run the batch file once again after making a modification in GUI text editor.
并且随着有@echo off
从批处理文件的第一行中删除,或更改为@echo ON
,或者用命令注释掉这一行REM或与::
(无效标签)开始时,还可以查看Windows命令解释器在应用立即环境变量扩展后真正执行的行以及在语法错误的情况下发生错误的位置。
第二批代码错误的是以下行:
for /f "tokens=1,2 delims=_" %%D_%%E in ("%%~nA") do (
指定为循环变量必须始终为 1 个字符。正确的是:
for /f "tokens=1,2 delims=_" %%D in ("%%~nA") do (
命令echo %DATE%
今天在我的计算机上输出我的帐户和区域设置的日期01.04.2017
.
命令echo %DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%
输出01-04-2017
.
所以这部分脚本有效。
Hint:格式的目录列表YYYY-MM-DD
比格式更好DD-MM-YYYY
。具有格式的目录列表YYYY-MM-DD
默认情况下会自动按字母顺序排序,此日期格式也会从最旧到最新排序。日期格式DD-MM-YYYY
默认情况下,会产生一个奇怪的按字母顺序排序的目录列表。
此任务的批处理文件可以是:
@echo off
set "CurrentDate=%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%"
for %%A in (*.avi *.jpg) do (
for /F "tokens=1,2 delims=_" %%D in ("%%~nA") do (
if not "%%E" == "" (
md "%CurrentDate%\%%D_%%E" 2>nul
move /Y "%%A" "%CurrentDate%\%%D_%%E\"
) else (
md "%CurrentDate%\%%D" 2>nul
move /Y "%%A" "%CurrentDate%\%%D\"
)
)
)
set "CurrentDate="
对于这个任务来说,内循环的工作原理是最有趣的。
for /F
and "%%~nA"
意思是命令FOR应该只处理 *.avi 或 *.jpg 文件的文件名,没有外部找到的文件扩展名FOR loop.
delims=_
意味着FOR命令应使用下划线作为分隔符将字符串分成多个部分(标记)。第一个文件名是JIM_BRICKMAN_QPS
这将分为:
-
JIM
分配给循环变量D
被指定在FOR命令行,
-
BRICKMAN
分配给循环变量E
这是中的下一个字符ASCII 表 http://www.asciitable.com/ after D
and
-
QPS
分配给循环变量F
.
此字符串分割功能是循环变量解释为区分大小写而环境变量解释为不区分大小写的原因。
With tokens=1,2
指定仅对第一和第二字符串部分感兴趣。如此内在FOR在确定前两个下划线分隔字符串并将它们分配给循环变量后可以停止字符串拆分D
and E
.
FOR如果可以确定至少 1 个由下划线分隔的字符串,则执行命令块。所以循环变量有可能D
有一个字符串值,但循环变量E
是一个空字符串,例如,如果文件名不包含任何下划线。这就是原因IF健康)状况。
命令MD默认情况下,在启用命令扩展的情况下创建整个目录树。因此,在搜索 *.avi 和 *.jpg 文件之前,无需显式创建日期子目录。这很好,因为当当前目录中没有 *.avi 和 *.jpg 文件时,它可以避免创建空日期目录。
由于当前目录中的 *.avi 和 *.jpg 文件应移动到DD-MM-YYYY\Token1_Token2
当然,在创建目录和移动文件时还需要使用今天的日期字符串指定环境变量。
输出的错误信息为MD如果目录存在(或者由于缺少权限而无法创建目录时)来处理STDERR被重定向为2>nul
到设备NUL来压制它。
The MOVE命令与选项一起使用/Y
将文件移动到目标文件夹,即使当前文件已存在于目标文件夹中。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
for /?
if /?
md /?
move /?
set /?
另请阅读 Microsoft 的文章:使用命令重定向运算符 https://technet.microsoft.com/en-us/library/bb490982.aspx.