首先,先感谢您的帮助。我试图做的是:
1)我有一个包含名称为
的文件的文件夹122098_482056_1453458.xls
122098_482057_1453459.jpg
122098_482057_1453460.xls
122098_482056_1453457.jpg
2)我想将这些文件移动到我用名称创建的文件夹:
PO_90_122118_0_US
PO_90_122122_0_US
PO_90_122098_0_US
注意:文件夹名称的第3部分与文件名的第一部分匹配。
我尝试了以下脚本,导致错误分别没有做任何事情。
我使用delims=_
,因为我的文件名由字符_
分隔。
使用tokens=1
以便使用文件名的第一部分。
@ECHO OFF
SETLOCAL
SET "sourcedir=D:\2009\2nd step batch - Copy"
SET "destdir=D:\2009\1st step batch"
FOR /f "delims=_" %%I IN (
'dir /b /ad "%destdir%\*" '
) DO (
FOR /f "tokens=1delims=(" %%s IN ("%%~I") DO (
IF EXIST "%sourcedir%\%%s*" ECHO(MOVE "%sourcedir%\%%s*" "%destdir%\%%I\"
)
)
GOTO :EOF
此批处理文件不输出任何行,这意味着没有找到要移动的文件,我不知道原因。
将所有122098_*
个文件移至文件夹PO_90_122118_0_US
的批处理代码有什么问题?
答案 0 :(得分:0)
以下是为此任务重写的批处理代码。
@ECHO OFF
SETLOCAL
SET "SourceDir=D:\2009\2nd step batch - Copy"
SET "DestDir=D:\2009\1st step batch"
FOR /F "tokens=1-3* delims=_" %%A IN ('DIR /AD /B "%DestDir%\*" 2^>nul') DO (
IF EXIST "%SourceDir%\%%C_*" MOVE "%SourceDir%\%%C_*" "%DestDir%\%%A_%%B_%%C_%%D\"
)
ENDLOCAL
在没有 ECHO 的情况下,在第二次运行中真正移动文件之前,您可以将 ECHO 插入 MOVE 以测试批处理文件。
对于目标目录中找到的每个子目录,目录名称使用下划线作为分隔符分为4个令牌。
PO
被分配给 FOR 命令行中定义的循环变量A
。90
被分配到ASCII table中的B
的下一个循环变量。122098
或其他真正感兴趣的数字被分配给循环变量C
。D
,而不会进一步分割。 IF 条件检查是否有任何文件以分配给循环变量C
的子目录名称和下划线开头。如果此条件为真,则移动相应的文件。
将子目录名称的所有4个部分指定为目标目录很重要,即当前子目录的完整名称。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
if /?
move /?
set /?
setlocal /?
2^>nul
重定向由 DIR 命令输出的令人困惑的错误消息,以便在设备找不到子目录的情况下处理 STDERR NUL 压制它。必须使用>
对重定向运算符^
进行转义,以便在执行命令 DIR 时将其解释为重定向运算符,而不是作为命令 FOR 的错误重定向运算符。另请参阅Microsoft文章Using command redirection operators。