如何在带有批处理文件的文件夹中循环

How to loop in a folder with batch file

我需要用批处理文件做一些事情....

我需要将一个文件夹复制到另一个文件夹,但是...

如果新文件夹存在,我需要验证新文件夹中的文件是否存在,然后我需要在复制新文件之前将文件末尾的“.old”重命名为文件。 我在 Java、php 等方面有丰富的编程经验,但对批处理文件却不是...

我正在使用 java/php 的语法来解释我的问题....

set folderOrigin=d:\test1
set folderFinal=d:\test5 
if EXIST %folderFinal% (
  for (fileOrigin : folderOrigin){
      variableNamefileOrigin = fileOrigin
      for (fileFinal : folderFinal){
          variableNamefileFinal = fileFinal            
          if (variableNamefileOrigin == variableNamefileFinal){
              newvariable = variableNamefileFinal + ".old"
              ren variableNamefileFinal newvariable
              xcopy /s /q %folderOrigin%+%variableNamefileOrigin% 
              %folderFinal%+%variableNamefileFinal% 
          }
      }
  }
) else (
    xcopy /s /q %dossierOrigine% %dossierDestinataire%
)
pause

谢谢大家!

假设源目录("folders" 是 GUI 中的工件;文件系统中的结构是 "directories")是 %sourceFolder%,目标目录是 %finalFolder% ;并假设您只需要复制 files (不是整个子树):

  1. 要循环遍历 %sourceFolder% 中的文件,您可以使用 for 循环:

    for %%f in ("%sourceFolder%\*") do call :copyOneFile "%%~f"
    exit /b
    
  2. 在子程序 :copyOneFile 中,当前文件为 %1。要检查它是否存在于 %finalFolder% 中,您可以使用 if exist,如果存在则重命名它,但在检查 .old 文件是否已经存在之前:

    :copyOneFile
    
    if exist "%finalFolder%\%~nx1" (
      if exist "%finalFolder\%~n1.old" del "%finalFolder\%~n1.old"
      ren "%finalFolder\%~nx1" "%~n1.old"
    )
    
  3. 现在您可以将文件从源文件夹复制到目标文件夹:

    copy "%~1" "%finalFolder%
    

要理解 %~nx1 等结构,请使用 for /?。请注意,ren 的第二个参数必须只有文件名,不允许路径。

如果您需要复制整个子树,则:

  • 复制文件后,用for /d重做以获取目录。

  • 使用适当的命令代替 delcopy