Batch file 修改批处理脚本循环中的变量
我正在根据文件名将其移动到预设文件夹中。我不想创建新文件夹。因此,仅当相应的文件夹已存在时,才应移动文件 文件名都遵循相同的模式:Batch file 修改批处理脚本循环中的变量,batch-file,Batch File,我正在根据文件名将其移动到预设文件夹中。我不想创建新文件夹。因此,仅当相应的文件夹已存在时,才应移动文件 文件名都遵循相同的模式:1234\u 123456\u AA************.(doc/pdf) 我有下面的脚本,可以使用: @echo on for /r %%f in (*.*) do ( echo processing "%%f" for /f "tokens=1-3 delims=_" %%a in ("%%~nxf") do ( move "
1234\u 123456\u AA************.
(doc
/pdf
)
我有下面的脚本,可以使用:
@echo on
for /r %%f in (*.*) do (
echo processing "%%f"
for /f "tokens=1-3 delims=_" %%a in ("%%~nxf") do (
move "%%f" C:\Users\xxxxxxxxx\Desktop\MOVEFILES\%%a_%%b_%%c\
)
)
pause
但我遇到的问题是,一些文件名在循环变量%%b
中有一个“0”占位符,例如1234\u 0123456\u AA
。但是这个文件名应该被解释为1234\u 123456\u AA
,我想把这个文件移到适当的文件夹中
我写过这样的话:
@echo on
SETLOCAL ENABLEDELAYEDEXPANSION
for /r %%f in (*.*) do (
for /f "tokens=1-3 delims=_" %%a in ("%%~nxf") do (
set z=%%b%
echo !z:~-6!
move "%%f" C:\Users\xxxxxxxxx\Desktop\MOVEFILES\%%a_%%z_%%c\
)
)
pause
我使用echo删除“0”占位符,但需要将其返回到文件应移动到的文件路径中的%%b
要在代码中修改什么以获得所需的行为?使用以下代码,并对所应用的进行更正和一些其他改进:
@echo off
setlocal EnableDelayedExpansion
for /R %%F in (*_*_*.*) do (
for /F "tokens=1-3 delims=_" %%A in ("%%~nxF") do (
set "MiddlePart=%%B"
set "MiddlePart=!MiddlePart:~-6!"
if exist "%USERPROFILE%\Desktop\MOVEFILES\%%A_!MiddlePart!_%%C\*" (
move /Y "%%F" "%USERPROFILE%\Desktop\MOVEFILES\%%A_!MiddlePart!_%%C"
)
)
)
endlocal
pause
下面详细解释代码的改进
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
echo/?
endlocal/?
如果/?
移动/?
设置/?
setlocal/?
%%f
和在循环内部使用%%f
来使用循环变量f
的字符串(不能是文件或文件夹名),而不使用引号,命令处理器将退出批处理并显示错误消息,因为它需要一个以上的字母,循环变量%%~f
被解释为循环变量?
的文件/文件夹的全名
循环变量和修饰符区分大小写。因此,%%~F
被命令处理器解释为循环变量F
的字符串,不带引号,%%~fF
被解释为循环变量F
的文件/文件夹的完整路径和扩展名的文件/文件夹名
一些其他字符,如#
也可以用作循环变量
3.使用引号为环境变量赋值
将字符串指定给环境变量时,最好使用它
set "variable=text or other variable"
如图所示使用引号的优点是,命令处理器会忽略最后一个双引号后不可见的空格/制表符
但只要使用
set variable=text or other variable
第一次等号后的所有内容都将分配给变量,包括尾部空格和制表符,这些空格和制表符可能是错误地添加到批处理文件的这一行中的。这几乎从来都不是好问题,而且是批处理执行问题的常见根源,只要正确使用引号就可以轻松避免
使用如下所示的引号也不好,因为在这种情况下,双引号都是分配给变量的文本的一部分(加上尾随空格/制表符)。这有时很有用,但通常是编码错误
set variable="text or other variable"
4.延迟扩张
如果应使用当前变量值而不是分配给块上方变量的值,则引用用(
…)
定义的块内的变量集或修改需要延迟扩展。因此,在原始代码中使用%%z
是错误的,因为变量z
没有在上面为循环定义,因此在执行循环时总是被替换为零
5.环境变量USERPROFILE
在命令提示窗口set
中运行会显示当前用户帐户的所有预定义环境变量。有变量USERNAME,但也有USERPROFILE包含用户配置文件目录的路径,其中包含Desktop
文件夹和其他与用户帐户相关的文件夹。使用环境变量USERPROFILE可以减少批处理文件对Windows版本和Windows语言的依赖性
注意:
由于当前目录及其所有子目录上的/R递归,所以运行的第一个。由于内部FOR循环将当前目录树中找到的所有文件移动到
%USERPROFILE%\Desktop\MOVEFILES
的子目录中,因此当前目录决不能是此路径的任何目录。%z
未定义,请使用!z:~-6代码>相反。这不起作用。这只会让你更快乐!z:~6!在文件名中,使用设置“z=%%~b”
(注意,您的代码中有有害的尾随%%
):如果echo!z:~-6代码>工作,然后ECHO-move“%%f”“%userprofile%\Desktop\MOVEFILES\%%a_uz:~-6!\%%c\”
也应工作(并在调试后立即删除ECHO
)。请注意集合“z=%%~b”
中的~
波浪线修饰符。这太棒了!非常感谢你提供的所有信息。