我需要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
我需要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
只是沒有用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
肯定是沒有錯與使用VBScript :-) (見OP's answer)
但我想我會指出你的批處理代碼出錯的地方。
.
將包含父目錄。你想*
,而不是讓孩子。C:\test\_git_\test
這樣的路徑應該得到該文件,因爲文件夾名稱不包含「git」(雖然父母)。你的代碼會在路徑的任何地方查找git。改進的附加分,雖然不是錯誤:
@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 – spekdrum 2012-10-18 10:44:04