0

\iTunes\Movies\ フォルダ内のディレクトリが外部ドライブにまだ存在しない場合、それらを外部ドライブにバックアップするバッチ ファイルを作成しようとしています。

@echo off 
cls
SetLocal EnableDelayedExpansion

for /f "delims=" %%F in ('dir /ad /b') do (
if not exist g:\movies\%%F      (
        echo Copying %%F to G:\Movies\%%F
rem         md G:\Movies\%%F
rem         copy M:\iTunes\Movies\%%F\*.* G:\Movies\%%F
    )
)

出力は次のとおりです。

Code:
Copying The Princess Bride to G:\Movies\The Princess Bride
Copying Green to G:\Movies\Green
Copying Red to G:\Movies\Red
Copying Princess to G:\Movies\Princess
Copying Bride to G:\Movies\Bride
Copying The Green Mile to G:\Movies\The Green Mile
Copying The Shawshank Redemption to G:\Movies\The Shawshank Redemption
Copying Grape to G:\Movies\Grape
Copying Roof to G:\Movies\Roof
Copying On to G:\Movies\On
Copying Fiddler On the Roof to G:\Movies\Fiddler On the Roof
Copying Brief to G:\Movies\Brief
Copying Number to G:\Movies\Number
Copying to to G:\Movies\to
Copying the to G:\Movies\the
Copying Gilbert Grape to G:\Movies\Gilbert Grape
Copying Torino to G:\Movies\Torino
Copying Sherlock Holmes to G:\Movies\Sherlock Holmes
Copying Gran Torino to G:\Movies\Gran Torino
Copying I Am Number Four to G:\Movies\I Am Number Four
Copying Too Big to Fail to G:\Movies\Too Big to Fail
Copying Pelican to G:\Movies\Pelican
Copying The Shunning to G:\Movies\The Shunning
Copying Inside Job to G:\Movies\Inside Job
Copying Shawshank to G:\Movies\Shawshank
Copying Holmes to G:\Movies\Holmes
Copying Four to G:\Movies\Four
Copying Am to G:\Movies\Am
Copying Big to G:\Movies\Big
Copying Job to G:\Movies\Job
Copying Mile to G:\Movies\Mile
Copying Fail to G:\Movies\Fail
Copying The Pelican Brief to G:\Movies\The Pelican Brief
Copying Shunning to G:\Movies\Shunning
Copying Redemption to G:\Movies\Redemption
Copying Labyrinth to G:\Movies\Labyrinth
Copying The Hunger Games to G:\Movies\The Hunger Games

M:\iTunes\Movies>

「The Green Mile」などの完全なディレクトリ名を正しく使用しているだけでなく、iTunes\Movies フォルダに存在するが存在しない各ディレクトリに対して「The」、「Green」、および「Mile」を誤って使用しています。外付けドライブ。

EnableDelayedExpansion を使用して、または使用せずに試してみましたが、さまざまな種類の変数の割り当てを試してみましたが、役に立ちませんでした。

「delims =」がプログラムされていて、%%F を二重引用符で囲んで試してみましたが、式が個々の要素に分割されているのはなぜですか?

4

2 に答える 2

1

コマンド自体の名前を引用符で囲み、tokens=* の部分が必要です (ここで説明されているように、「行を読み取るために FOR ループで使用する区切り文字は?

@echo off 
cls
SetLocal EnableDelayedExpansion

for /f "tokens=*" %%F in ('dir /ad /b') do (
if not exist "g:\movies\%%F"      (
        echo Copying "%%F" to "G:\Movies\%%F"
rem         md "G:\Movies\%%F"
rem         copy "M:\iTunes\Movies\%%F\*.*" "G:\Movies\%%F"
    )
)

この引用符の必要性は、(ファイル名のように) スペースを含む可能性のあるバッチ変数から構築されている Windows コマンドにパラメーターがある場合は常に当てはまります。

于 2012-12-31T19:38:47.860 に答える
1

これが私の表現です。スクリプトに役立ついくつかの拡張機能があるためです。それを修正する必要があったのは、exist、md、および copy パスの周りの引用だけでした。

  1. ループに単純なディレクトリを使用します。
  2. オプションを使用~nxして周囲の引用符を削除し、コマンド ライン パーサーが値を返す方法を変更することを決定した場合にフォルダーの名前のみを使用します。(将来の証明)
  3. 存在するパスとコピーするパスの末尾に追加\して、それがディレクトリであることを指定し、同じ名前を持つ可能性のあるファイルと一致しないようにします。
  4. ディレクトリcopyが正常に作成された場合にのみコピーが行われることを意味しますmd&&

コード:

@echo off 
cls
SetLocal EnableDelayedExpansion

for /d %%D in (*) do if not exist "G:\Movies\%%~nxD\" (
    echo Copying %%~fD to G:\Movies\%%~nxD
    rem md "G:\Movies\%%~nxD" && copy "%%~fD\*.*" "G:\Movies\%%~nxD\"
)

さらにオプションが必要な場合は、 xcopyandコマンドを調べることもお勧めします。robocopy

于 2012-12-31T21:45:10.830 に答える