2012-07-28 103 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"