【问题标题】:Copy a file to all subfolders of a folder将文件复制到文件夹的所有子文件夹
【发布时间】:2012-07-28 19:05:37
【问题描述】:

我需要将 test.swf 复制到 c:/test 文件夹的所有不包含“git”字的子文件夹

刚刚尝试了类似的方法,但没有成功

@setlocal enableextensions enabledelayedexpansion
@echo off
for /r %%a in (.) do
( 
if not x%a:git=%==x%a% do
(
@copy "C:\test.swf" %a > nul
)
)
endlocal

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    使用 vbscript 肯定没有错 :-) (见OP's answer

    但我想我会指出你的批处理代码哪里出错了。

    • 左括号必须与 IF 或 DO 在同一行,并且前面必须有一个空格。
    • DO 不与 IF 一起使用
    • 您还需要 FOR /D 选项与 /R 一起使用。没有它,您将获得文件而不是目录。
    • 您的. 将包括父目录。您希望 * 只接收孩子。
    • 我不确定您的要求,但我假设像C:\test\_git_\test 这样的路径应该获取文件,因为文件夹名称不包含“git”(尽管父目录包含)。您的代码会在路径中的任何位置查找 git。
    • 在批处理文件中,所有 FOR 变量都必须用双百分号引用,如 %%a 中所示。你前后不一致。
    • 您不能对 FOR 变量执行搜索和替换,只能对环境变量执行搜索和替换。

    其他需要改进的地方,但不是错误:

    • 很少需要 enableExtensions。默认启用。
    • 最好将@echo off 放在顶部,然后在每个命令前加上@
    • 您启用了延迟扩展,但没有使用它。虽然使用您的算法的正确解决方案需要它。

    这是您的算法的正确代码。 (实际上下面的代码解决方案都没有经过测试,但我认为我猜对了)

    @echo off
    setlocal enableDelayedExpansion
    for /d /r "c:\test" %%F in (*) do (
      set "name=%%~nxF"
      if "!name:git=!" neq "!name!" copy "c:\test.swf" "%%F" >nul
    )
    

    以上通常有效。但如果文件夹名称包含! 则会失败,因为延迟扩展会破坏 %%F 的扩展。解决方案是在循环中打开和关闭延迟扩展。

    @echo off
    setlocal disableDelayedExpansion
    for /d /r "c:\test" %%F in (*) do (
      set "name=%%~nxF"
      setlocal enableDelayedExpansion
      if "!name:git=!" neq "!name!" (
        endlocal
        copy "c:\test.swf" "%%F" >nul
      ) else endlocal
    )
    

    但是有一个更简单的方法。您可以使用正则表达式将 DIR 的结果通过管道传输到 FINDSTR,该正则表达式将过滤掉名称中带有“git”的文件夹。然后使用 FOR /F 处理结果。
    编辑 - 我简化了正则表达式。

    @echo off
    for /f "delims=" %%F in (
      'dir /ad /s /b "c:\test\*" ^| findstr /virc:"git[^\\]*$"'
    ) do copy "c:\test.swf" "%%F"
    

    整个过程可以在命令行中的一行完成

    for /f "delims=" %F in ('dir /ad /s /b "c:\test\*" ^| findstr /virc:"git[^\\]*$"') do @copy "c:\test.swf" "%F"
    

    【讨论】:

      【解决方案2】:

      只是用 vbscript 做的

      Const SourceDir = "C:\source"
      Const TargetDir  = "C:\target\"
      
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      Set objFolder = objFSO.GetFolder(TargetDir)
      Set colSubfolders = objFolder.Subfolders
      
      Set dosyalarklasor = objFSO.GetFolder(SourceDir)
      Set dosyalar = dosyalarklasor.Files
      
      
      For Each objSubfolder in colSubfolders
          if not instr(objSubfolder.Name,".git") > 0 then
              For Each dosya in dosyalar
              objFSO.CopyFile dosya, TargetDir & objSubfolder.Name & "\"
              Next
          end if 
      Next
      

      【讨论】:

      • 嗨,我发现你的代码正在寻找类似的东西。你帮了我很多!谢谢! +1
      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 2013-04-12
      • 2016-10-25
      • 2021-04-09
      相关资源
      最近更新 更多