2012-07-28 97 views
0

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

回答

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 
+1

嗨,我发现你的代码在寻找类似的东西。你帮了我很多!谢谢! +1 – spekdrum 2012-10-18 10:44:04

5

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

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

  • 左paren必须与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"