Windows 使用递归for循环移动文件的批处理文件
我正在尝试创建一个批处理脚本,以便根据搜索条件将文件移动到具有相同子文件夹结构的另一个文件夹中 我尝试了以下方法,但结果不太正确Windows 使用递归for循环移动文件的批处理文件,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试创建一个批处理脚本,以便根据搜索条件将文件移动到具有相同子文件夹结构的另一个文件夹中 我尝试了以下方法,但结果不太正确 for /r "c:\Test_Copy\Source1\" %%x in (Test*.txt) do move "%%x" "c:\Test_Copy\Target1\" 正如它所显示的那样 move "c:\Test_Copy\Source1\Sub1\Test1.txt" "c:\Test_Copy\Target1\" move "c:\Test_Copy\
for /r "c:\Test_Copy\Source1\" %%x in (Test*.txt) do move "%%x" "c:\Test_Copy\Target1\"
正如它所显示的那样
move "c:\Test_Copy\Source1\Sub1\Test1.txt" "c:\Test_Copy\Target1\"
move "c:\Test_Copy\Source1\Sub2\Test1.txt" "c:\Test_Copy\Target1\"
我希望结果如下
move "c:\Test_Copy\Source1\Sub1\Test1.txt" "c:\Test_Copy\Target1\Sub1\Test1.txt"
move "c:\Test_Copy\Source1\Sub2\Test1.txt" "c:\Test_Copy\Target1\Sub2\Test1.txt"
我怎样才能做到这一点
谢谢如果要使用批处理,您需要修改
%%x的值以指向循环中的目标目录。执行此操作时,不能使用%
包围在for循环内创建的变量-必须使用的延迟扩展代码>以包围这些变量。然后可以在%%x
上使用变量替换来更改其值
如注释所述,如果目录/文件名包含多个感叹号,则此操作无效
这正是你想要的我认为:
@echo off
setlocal enabledelayedexpansion
set sourcedir=c:\Test_Copy\Source1\
set targetdir=c:\Test_Copy\Target1\
for /r "%sourcedir%" %%x in (Test*.txt) do (
set sourcefile=%%x
set destfile=!sourcefile:%sourcedir%=%targetdir%!
echo move !sourcefile! !destfile!
)
当您准备好实际执行移动时,只需将echo move
更改为move
。如果要使用批处理,则需要修改%%x的值,以指向循环中的目标目录。执行此操作时,不能使用%
包围在for循环内创建的变量-必须使用的延迟扩展代码>以包围这些变量。然后可以在%%x
上使用变量替换来更改其值
如注释所述,如果目录/文件名包含多个感叹号,则此操作无效
这正是你想要的我认为:
@echo off
setlocal enabledelayedexpansion
set sourcedir=c:\Test_Copy\Source1\
set targetdir=c:\Test_Copy\Target1\
for /r "%sourcedir%" %%x in (Test*.txt) do (
set sourcefile=%%x
set destfile=!sourcefile:%sourcedir%=%targetdir%!
echo move !sourcefile! !destfile!
)
当您准备好实际执行移动时,只需将echo move
更改为move
。返回完全绝对路径,甚至不允许返回相对路径。但是,您可以使用,它只列出它将在不使用/L
选项的情况下复制的文件,以及相对于源根目录的路径;该列表可由以下人员轻松捕获和处理:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u SOURCE=C:\Test\u Copy\Source1”
设置“\u DESTIN=C:\Test\u Copy\Target1”
rem//更改为源根目录:
pushd“%\u源%”和(
rem/*运行'xcopy/L'列出文件,但不实际复制任何文件,因为这样会返回
相对于源根目录的rem路径;然后让`for/F`捕获该路径
rem列表,拆分前面的驱动器号并跳过摘要行:*/
对于/F“tokens=2 delims=:”%%F in('
xcopy/L/S/Y“测试*.txt”“%TEMP%”
""做"(
rem//创建可能需要的子目录,在存在时抑制错误:
2> nul md“%\u目的地%\%F\..”
rem//实际将当前迭代的文件移动到目标目录:
移动“%%F”“%\u目的地%\%%F”
)
rem//从源根目录返回:
邻苯二胺
)
端部
退出/B
这种方法的最大优点是不涉及字符串操作来派生相对路径,这是危险的,因为它在某些情况下可能会失败(例如,当给定像D:\
这样的根路径时,或者当指定像D:\some\.\source\dummy\..\folder
这样的路径时)
当然,您也可以按照用户的建议使用:
robocopy“C:\Test\u Copy\Source1”C:\Test\u Copy\Target1“Test*.txt”/S/MOV/NDL/NJH/NJS
返回完整的绝对路径,甚至不允许返回相对路径。但是,您可以使用,它只列出它将在不使用/L
选项的情况下复制的文件,以及相对于源根目录的路径;该列表可由以下人员轻松捕获和处理:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“\u SOURCE=C:\Test\u Copy\Source1”
设置“\u DESTIN=C:\Test\u Copy\Target1”
rem//更改为源根目录:
pushd“%\u源%”和(
rem/*运行'xcopy/L'列出文件,但不实际复制任何文件,因为这样会返回
相对于源根目录的rem路径;然后让`for/F`捕获该路径
rem列表,拆分前面的驱动器号并跳过摘要行:*/
对于/F“tokens=2 delims=:”%%F in('
xcopy/L/S/Y“测试*.txt”“%TEMP%”
""做"(
rem//创建可能需要的子目录,在存在时抑制错误:
2> nul md“%\u目的地%\%F\..”
rem//实际将当前迭代的文件移动到目标目录:
移动“%%F”“%\u目的地%\%%F”
)
rem//从源根目录返回:
邻苯二胺
)
端部
退出/B
这种方法的最大优点是不涉及字符串操作来派生相对路径,这是危险的,因为它在某些情况下可能会失败(例如,当给定像D:\
这样的根路径时,或者当指定像D:\some\.\source\dummy\..\folder
这样的路径时)
当然,您也可以按照用户的建议使用:
robocopy“C:\Test\u Copy\Source1”C:\Test\u Copy\Target1“Test*.txt”/S/MOV/NDL/NJH/NJS
@echo off
对于/D/R“c:\Test\u Copy\Source1\”%%I in(*)do pushd“%%~I”和(
2> nul>nul mkdir“c:\Test\u Copy\Target1\%%~nxI”
移动“%%~I\Test*.txt”c:\Test\u Copy\Target1\%%~nxI”&popd
)
- 输出命令循环结果:
move“c:\Test\u Copy\Source1\Sub1\Test\u 001.txt”c:\Test\u Copy\Target1\Sub1\Test\u 001.txt
移动“c:\Test\u Copy\Source1\Sub1\Test\u 002.txt”c:\Test\u Copy\Target1\Sub1\Test\u 002.txt
移动“c:\Test\u Copy\Source1\Sub1\Test\u 003.txt”c:\Test\u Copy\Target1\Sub1\Test\u 003.txt
移动“c:\Test\u Copy\Source1\Sub2\Test\u 001.txt”c:\Test\u Copy\Target1\Sub2\Test\u 001.txt
移动“c:\Test\u Copy\Source1\Sub2\Test\u 002.txt”c:\Test\u Copy\Target1\Sub2\Test\u 002.txt
移动“c:\Test\u Copy\Source1\Sub2\Test\u 003.txt”c:\Test\u Copy\Target1\Sub2\Test\u 003.txt
move
命令的结果: