0

「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
4

2 に答える 2

5

確かにvbscriptを使用しても問題はありません:-) OPの回答を参照)

しかし、私はあなたのバッチコードがどこで間違っていたかを指摘しようと思いました。

  • 左側のパレンはIFまたはDOと同じ行に配置する必要があり、前にスペースが必要です。
  • DOはIFでは使用されません
  • / Rと一緒に使用するには、FOR/Dオプションも必要です。これがないと、ディレクトリの代わりにファイルを取得できます。
  • .親ディレクトリが含まれます。*代わりに、子供だけを取得したい。
  • C:\test\_git_\test要件についてはわかりませんが、フォルダ名に「git」が含まれていないため(親には含まれていますが)、のようなパスでファイルを取得する必要があると思います。あなたのコードはパスのどこでもgitを探します。
  • すべてのFOR変数は、バッチファイルの場合の%% aのように、2パーセントで参照する必要があります。あなたは一貫していませんでした。
  • 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
)

しかし、もっと簡単な方法があります。名前に「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"
于 2012-07-29T03:02:25.520 に答える
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
于 2012-07-28T19:23:59.997 に答える