双FOR循环移动文件

时间:2014-01-14 22:18:49

标签: batch-file

感谢您提前提供任何帮助。

我正在尝试制作一个批处理文件来移动某个文件夹中的文件。

只是一点背景。 我有一个文件夹和结构如下:

C:\测试

  • APP1 \ app1.exe
  • APP2 \ app2.exe
  • APP3 \ app3.doc
  • XX [XX]的.exe
  • XX2 \ xx2.exe
  • XX3 \ xx3.EXE

换句话说,我有一个包含几个子文件夹的文件夹,每个子目录都有一些文件。我想要做的是使用脚本,循环所有文件夹,将所有文件包含“app”移动到文件夹app,然后将所有文件“xx”移动到文件夹xx - 为了最大限度地减少工作量,我已经创建了这两个文件夹,所以脚本不需要决定是否必须创建一个新的目录。

以下是我的脚本,

@echo off
rem loop xx
FOR /r "C:\test\" %%G in (*xx*.*) DO (
Echo Found file - %%G
copy %%G c:\testf\xx\
set pathname=%%G
for %%K in ("%pathname%") do ( set filepath=%%~dpK
set filename=%%~nxK
echo Filepath is %filepath%
echo %filename% >> c:\output.log )
echo full is %pathname% )
rem loop app
FOR /r "C:\test\" %%H in (*app*.*) DO (
Echo Found file - %%H
copy %%H c:\testf\app\
set pathname=%%H
for %%L in ("%pathname%") do ( set filepath=%%~dpL
set filename=%%~nxL
echo Filepath is %filepath%
echo %filename% >> c:\output.log )
echo full is %pathname% )
Echo "All Done"

当前输出日志显示

xx3.EXE  
xx3.EXE  
xx3.EXE  
app3.EXE  
app3.EXE  
app3.EXE 

和xx文件仅发送到xx文件夹,但app文件没有。 我可以帮忙解决这个问题吗?

我非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

您的应用程序文件的路径可能包含空格 - 除非您包含引号,否则会破坏COPY命令。

您的脚本比需要的要复杂得多。内循环不需要。您还可以通过使用循环来获取两个字符串来消除代码。我会这样编写它以获得相同的结果,COPY命令用引号固定:

@echo off
for %%A in (xx app) do (
  for /r "c:\test\" %%F in (*%%A*.*) do (
    echo Found file - %%F
    copy "%%F" "c:\testf\%%A\"
    echo Filepath is %%~dpF
    echo %%~nxF >>c:\output.log
    echo full is %%F
  )
)
echo "All Done"

请注意,将同一文件名从多个源目录复制到一个目标目录中将只生成一个文件 - 最后一个复制的胜利。

答案 1 :(得分:0)

您可以使用FIND来测试您的文件:

@echo off&cls

for %%a in (xx app) do call:Treat %%a

exit /b
:Treat
echo Treating : [%1]
for /f "delims=" %%a in ('dir/a-d/b/s ^| find "%1"') do echo copy "%%a" "c:\test\%1"

我在你可以测试输出的副本之前放了一个echo。