【问题标题】:Double FOR loop to move files双 FOR 循环移动文件
【发布时间】:2014-01-14 22:18:48
【问题描述】:

提前感谢您的帮助。

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

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

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 文件夹,但应用程序文件没有。 我可以帮忙解决这个问题吗?

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

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    也许您的应用文件的路径包含空格 - 除非您包含引号,否则会破坏 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"
    

    请注意,将相同的文件名从多个源目录复制到一个目标目录将导致只有一个文件 - 最后一个复制的获胜。

    【讨论】:

    • 您好 Dbenham,感谢您的帮助。我刚刚再次尝试了您的脚本,但是在循环 xx 文件后我仍然收到“系统找不到指定的路径” - 所有 xx 文件都正确发送到 xx 文件夹,但应用程序文件似乎不是。再次感谢。 ps,输出显示正确,[xx].EXE xx2.exe xx3.EXE app1.EXE app2.exe app3.EXE
    【解决方案2】:

    您可以使用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"
    

    我在副本前放了一个回显,你可以测试输出。

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多