将文件复制到文件夹的所有子文件夹

时间:2012-07-28 19:05:37

标签: windows batch-file cmd

我需要将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

2 个答案:

答案 0 :(得分:5)

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

但我想我会指出您的批处理代码出错的地方。

  • 左边的paren必须和IF或DO在同一条线上,并且必须有前面的空格。
  • DO不与IF
  • 一起使用
  • 你还需要FOR / D选项和/ R一起使用。如果没有它,你将得到文件而不是目录。
  • 您的.将包含父目录。您希望*代替孩子。
  • 我不确定您的要求,但我假设C:\test\_git_\test之类的路径应该获取该文件,因为文件夹名称不包含" git" (虽然父母这样做)。你的代码会在路径的任何地方寻找git。
  • 在批处理文件中,所有FOR变量必须以%%a引用,如%% 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"

答案 1 :(得分:1)

刚刚通过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