Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Batch file 修改批处理脚本循环中的变量_Batch File - Fatal编程技术网

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/?


1.搜索模式 第一个改进是在firstFOR中使用的模式,因为只有文件名中至少有2个下划线才能移动。这种模式仍然不是最好的,但对于这项任务来说已经足够好了

2.循环变量 最好使用大写的循环变量,以避免修改器出现问题

例如,使用as循环变量
%%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”
中的
~
波浪线修饰符。这太棒了!非常感谢你提供的所有信息。