別のフォルダに存在する場合にのみフォルダをコピーするバッチファイル FOR ループ

別のフォルダに存在する場合にのみフォルダをコピーするバッチファイル FOR ループ

あるフォルダーの場所から別のフォルダーにフォルダーをコピーするバッチ ファイルを作成しようとしていますが、そのコピーは 3 番目のフォルダーに存在する場合に限ります。

わかりにくいようですね。もう一度試してみます。

次の 3 つのフォルダーがあります。

  • アップデート
  • アプリケーション
  • 以前のバージョン

\Applicationsサブフォルダー構造を [新しいバージョン] のサブフォルダー構造に更新する前に、サブフォルダー構造をフォルダーに\Updatesコピーする必要があります。それが完了したら、サブフォルダー構造をフォルダーにコピーする必要があります。\Applications\Previous VersionsUpdates/Applications

私は次のことを知りました:

Setlocal EnableDelayedExpansion

Set UpdtRoot=C:\Test\Updates
Set AppsRoot=C:\Test\Apps
Set PVerRoot=C:\Test\Previous Versions

FOR /d %%i IN ("!UpdtRoot!\*.*") DO xcopy "!AppsRoot!\%%~nxi" "!PVerRoot!\%%~nxi\" /e

ただし、これは機能しません。すべてのフォルダーが AppsRoot から PVerRoot にコピーされます。

AppsRootサブフォルダを からにコピーする必要がありますPVerRootが、 にサブフォルダが存在する場合のみですUpdtRoot。 フォルダとサブフォルダのみをコピーする必要があるので、ファイルは一切コピーしません。

答え1

/Applications説明どおりに、すべてのサブフォルダーをディレクトリからディレクトリに再帰的にコピーするバッチ スクリプトを追加しました/Previous Versions。ただし、コピーする同じディレクトリが/Updatesディレクトリ内に存在する場合のみです。

注目アイテム

  • SET NewCopyDir=%CopyDir:C:\Test\Apps\=%末尾のバックスラッシュを含むディレクトリの完全パスと一致する文字C:\Test\Apps\が に含まれていることを確認します。これは、およびディレクトリApplicationsの末尾に追加するように解析するロジックであり、コマンドはそれに応じてそれらのディレクトリをコピーします。/Updates/Previous VersionsXCOPY

  • Root名前の部分はディレクトリの変数から削除されましたがSET、それはあまり重要ではありません。ただし、スクリプト ロジックで少しきれいに見えるように、それらを短縮しました。

バッチスクリプト

@ECHO ON

SET "Updt=C:\Test\Updates"
SET "Apps=C:\Test\Apps"
SET "PVer=C:\Test\previous Versions"
IF NOT EXIST "%Updt%" MD "%Updt%"
IF NOT EXIST "%Apps%" MD "%Apps%"
IF NOT EXIST "%PVer%" MD "%PVer%"

FOR /D %%S IN ("%Apps%\*") DO (
    CALL :Routine "%%~S"
)
GOTO :EOF

:Routine
SET CopyDir=%~1
SET NewCopyDir=%CopyDir:C:\Test\Apps\=%
IF EXIST "%Updt%\%NewCopyDir%" XCOPY /E /T "%Apps%\%NewCopyDir%" "%PVer%\%NewCopyDir%\"
GOTO :EOF

サポートリソース

  • 電話
  • コピー

      /E           Copies directories and subdirectories, including empty ones.
                   Same as /S /E. May be used to modify /T.
    
      /T           Creates directory structure, but does not copy files. Does not
                   include empty directories or subdirectories. /T /E includes
                   empty directories and subdirectories.
    

関連情報