2

setlocal の目的はわかりませんが、for ループで複数のコマンドを必要とする別のスクリプトの例で見つけました。

Filelist.txt には、共有への完全なファイル パスを含むファイルのリストが保持されます。

例: \\FileShare\Division\Project\file.txt

setlocal enabledelayedexpansion
for /f "delims=" %%i in (filelist.txt) do (
mkdir "D:\Archive\%%~dpi"
move "%%i" "D:\Archive\%%i")
endlocal

このスクリプトは、filelist.txt 内のファイルを (1 行ずつ) 取得し、パスのディレクトリ構造をコピーしてから、ファイルを移動します。上記の例を使用すると、ディレクトリ D:\Archive\FileShare\Division\Project\ が作成され、ファイルfile.txtがそのディレクトリに移動されます。

ここで見つけたさまざまなタスクの既存の例から、これをつなぎ合わせました。掃除のコツは?

編集:以下のウィルからのコメントに対処するには。このスクリプトは、1 年以上アクセスされていないファイルから生成されたレポートを処理するために作成されました。これが、フォルダー構造と他のすべてのファイルをそのまま維持したかったため、ファイルのリストから作業する必要があった理由です。これをスクリプトに統合する方法があれば、それは素晴らしいことです!

4

1 に答える 1

0

delayed expansionまたは は必要ありませんsetlocalsetlocal変数に加えられた変更がそのスコープに分離されたままになるように、セクションのスコープを分離します。遅延展開は、ループ内または if ステートメント内で変数を展開する場合にのみ必要です。スクリプトで実際にクリーンアップすることはあまりありません。問題なくタスクを効率的に実行できる場合は、変更する必要はありません。

変更とその理由

  1. setlocal EnableExtensions スコープの分離は必要ありませんが、オプションを使用するには拡張機能を有効にする必要がありfor /fます。
  2. %%F大文字%%iは修飾子と区別しやすいからです。(可読性)
  3. if exist "%%~fA"スクリプトの実行時にリスト内のファイルがまだ存在することを確認します。
  4. for /f "tokens=1 delims=:" %%D in ("%%~dF") doフォルダ名にコロンを含めることはできないためです。これにより、ドライブのファイル パスからコロン文字が削除されます。
  5. &&移動先が正常に作成された場合にのみ、ファイルの移動を試みてください。

コード:

rem Hide the Command Output.
@echo off
rem Isolate Variable Scope and Enable Extensions.
setlocal EnableExtensions
rem Loop through the file list and verify file existence.
for /f "delims=" %%F in (filelist.txt) do if exist "%%~fF" (
    rem Parse the drive letter since colon : is not a valid folder character.
    for /f "tokens=1 delims=:" %%D in ("%%~dF") do (
        rem Create the folder hierarchy
        mkdir "D:\Archive\%%~D\%%~pF" && move "%%~fF" "D:\Archive\%%~D\%%~pF"
    )
)
endlocal
于 2013-01-10T20:34:40.387 に答える