0

フォルダー内のすべてのファイルを再帰的に検索し、各ファイルに対してコマンドおよび/またはコマンドのリストを実行するスクリプトを作成しようとしています。これがどのように機能する必要があるかの例です:

  • ファイル名に「1080p」を含むファイルの検索フォルダ
  • このファイルをローカル ディレクトリにコピーしますがファイル名から「1080p」を削除します。
  • それらのファイルに対して別のバッチ スクリプトを実行します (既にその部分が機能しています)。

これはすべて自動化する必要があります。

Windows コマンド プロンプトでこれを行う必要があり、必要な他のプログラムを使用するつもりです。
私はすでに同様のバッチ スクリプトで SED を使用しています。

4

2 に答える 2

3
@echo off
setlocal disableDelayedExpansion

set "src=sourcePath"
set "dst=destinationPath"
set "search=1080p"

for /r "%src%" %%F in (*%search%*) do (
  set "full=%%~fF"
  set "name=%%~nxF"
    setlocal enableDelayedExpansion
    copy "!full!" "%dst%\!name:%search%=!"
    endlocal
)
REM call your batch script here to process the copied files

同じファイル名が複数のソースフォルダに存在する場合、問題が発生する可能性があります。しかし、それはあなたが述べた要件に関する一般的な問題です。

説明:

%%~fF%%Fに含まれるファイルへのフルパスを示します

$$~nxF%%Fに含まれるファイルの名前と拡張子のみを指定します

タイプHELP FORまたはFOR /?FOR変数展開に使用可能な修飾子の詳細については。

!name:%search%=!遅延展開を使用して名前の内容を検索し、検索値を何も置き換えません。この例では、%search%=1080pです。検索では大文字と小文字が区別されないことに注意してください。

ステートメントが解析されるときにパーセントを使用する通常の展開が発生するため、ループ内で検索と置換を行うときに遅延展開を使用する必要があります。ただし、括弧の内容を含むFOR構文全体は、1つの論理ステートメントとして解析されます。したがって、通常の展開では、ループが実行される前にnameの値が与えられます。それは機能しません:-)遅延拡張は、行が実行されるたびに現在の値を示します。

検索と置換、および拡張の遅延に関する詳細については、HELP SETまたはを入力してください。SET /?

はファイル名の有効な文字であるため、遅延展開のオンとオフを切り替える必要があり!ます。%% F展開では、値が含まれていると値が破損します!

于 2012-06-05T17:41:23.357 に答える
2

いくつかの一般的な Unix ユーティリティを簡単に利用するために cygwin を使用することをお勧めします。

ファイルのリストを名前で検索し、それぞれに対してコマンドを実行します。

find . -name \*1080p\* | xargs <command>

ファイルのリストを検索し、移動/名前変更コマンドのリストを作成して、「1080p」文字列を削除します。

find . -name \*1080p\* | perl -ne 'chomp();$x=$_;s/1080p//g;print"cp $x /target/$_\n"'
# add "| sh" to run the commands, or "> commands.sh" to generate a script

PERL のみを必要とする CMD で実行するコマンド

dir /s /b | perl -ne 'chomp();$x=$_;s/1080p//g;print"copy $x c:\target\$_\n"' > cmds.bat

もちろん、スクリプトを調整して、必要なことを行います。しかし、私はこれがあなたの目標を達成すると信じています。Windows CMD でこれを行う賢い方法があるかもしれませんが、私は CMD の専門家ではありません。Unix ユーティリティは (IMHO) はるかに簡単です!

于 2012-06-05T16:19:28.307 に答える