「git」という単語を含まないc:/testフォルダーのすべてのサブフォルダーにtest.swfをコピーする必要があります
そのようなことを試したがうまくいかなかった
@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
「git」という単語を含まないc:/testフォルダーのすべてのサブフォルダーにtest.swfをコピーする必要があります
そのようなことを試したがうまくいかなかった
@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を使用しても問題はありません:-) (OPの回答を参照)
しかし、私はあなたのバッチコードがどこで間違っていたかを指摘しようと思いました。
.
親ディレクトリが含まれます。*
代わりに、子供だけを取得したい。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
)
しかし、もっと簡単な方法があります。名前に「git」が含まれるフォルダーをフィルターで除外する正規表現を使用して、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"
すべてのプロセスは、コマンドラインから1行で実行できます
for /f "delims=" %F in ('dir /ad /s /b "c:\test\*" ^| findstr /virc:"git[^\\]*$"') do @copy "c:\test.swf" "%F"
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