将文件复制到文件夹的所有子文件夹(Copy a file to all subfolders of

2019-09-20 09:39发布

我需要test.swf拷贝到c的所有子文件夹:/ test文件夹中的不包含“混帐”字

刚刚试过类似的东西,但没有奏效

@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

Answer 1:

肯定是有什么不妥使用VBScript :-)(见OP的答案 )

但我想我会指出哪里批处理代码出了问题。

  • 左括号必须在同一行IF或做的,必须有前面的空间。
  • 做的不是与IF使用
  • 您还需要FOR / d选项与/ R一起去。 没有它,你会得到的文件,而不是目录。
  • . 将包括父目录。 你想* ,而不是得到公正的孩子们。
  • 我不知道你的要求,但我认为像一个路径C:\test\_git_\test应该得到的文件,因为文件夹名称中不包含“混帐”(尽管父一样)。 您的代码会寻找任何地方的git的路径。
  • 所有变量都必须用双百分比被引用为当一个批处理文件%%一个。 你并不一致。
  • 你不能在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。 然后使用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"


Answer 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


文章来源: Copy a file to all subfolders of a folder