Windows XPのバッチファイルの連結
-
19-09-2019 - |
質問
私は、次のとんでもないタスクを達成しようとしています:
私は、完全修飾filesnamesのセットを含むテキストファイルを持っています。私は、ファイルを反復処理し、コマンドラインツールに渡すことができ、共通の変数にそれぞれの行を追加します。たとえば、ファイルは次のようになります。
C:\ DIR \ test.txtの
C:\ WINDOWS \ test2.txtという名前の
C:\ text3.txt
と私はいくつかの変数「」ように割り当てるしたいと思います:
a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"
二次の質問です - 良いバッチファイルの参照は何ですか?私は特に、完全なWindowsの材料ではいくつかのもの、そして自家製の多くのウェブサイトが、何を見つけています。
解決
の参照用として、 SS64.com のは悪いことではありません。 ロブ・ファン・デル・Woude には、あまりにも、かなり頻繁にリンクされます。
<時間>あなたの問題に関しては、それは簡単です:
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
<時間>
より詳細な説明:
setlocal enableextensions enabledelayedexpansion
ここでは、の遅れ拡張のを可能にしています。そうでない場合は、我々は次のfor
ループ内のファイルのリストを操作することはできませんので、これは非常に重要です。
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
ファイルの行を超える for /f
の繰り返し処理は、まさに私たちはここにする必要があります。各ループの反復では、LIST
変数に次の行を追加します。代わりに、通常の!LIST!
の%LIST%
の使用に注意してください。これが遅延展開を信号や変数は、このコマンドが実行されるたびに再評価されることを保証します。
通常cmd
はラインを読み取って解析されるとすぐにそれらの値に変数を展開します。 cmd
のために単一の行は、我々がここで使用されるもののような括弧で区切られたブロックのための真の保持するために起こるライン、としてをカウントの行またはすべてのいずれかです。だから、cmd
完全にブロックするために関係なく、どのように頻繁に内部ループの実行のの、読み、一度解析されます単一のステートメントである。
%LIST%
のここ!LIST!
を使用していた場合は、、変数は(その時点では空)、その値によって即座に交換されていたであろうと、ループはこのように見えただろう。
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
これは明らかに我々が望んでいたものではありません。遅延拡大は、変数は、その値が本当に必要とされているときにのみ展開されていることを確認します。この場合、ループの実行の内部には、ファイル名のリストを作成します。
その後、変数%LIST%
または!LIST!
は(今本当に使用するもう関係ありません)ファイルからの行のリストが含まれています。
Funnily十分、set
コマンドのヘルプは、遅延拡大のため、まさにこの例が含まれます:
最後に、サポートが遅れ 環境変数の展開を持っています 追加されて。このサポートは常にあります デフォルトでは無効にしてもよいが、 / Vコマンドによって有効化/無効化 CMD.EXEにラインスイッチ。参照してくださいCMD /?
遅延環境変数の展開 周りを取得するために有用です 現在の拡張の制限 これは、テキストの行がある場合に発生 それが実行されていない場合は、お読みください。ザ・ 例を示し、次の 当面の変数を持つ問題 拡張ます:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "%VAR%" == "after" @echo If you see this, it worked )
以来、メッセージを表示することはありません BOTH IF文の%VAR%です ときに最初IF置換 文は論理的に、それ以来、読まれます ある場合には、本体を含みます 複合文。だから、IF 複合文である内部 本当に「前」と「後」の比較 これは同じになることはありません。同様に、 次の例では、として機能しません 予想ます:
set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%
で、それはのリストを構築しないこと 現在のディレクトリ内のファイルが、 だけではなく、リストを設定します 最後のファイルへの変数が見つかりました。 %のLIST%があるので繰り返しますが、これは、 一度だけときFOR拡大 文は読み、その時れます LIST変数が空です。そう 私たちが実行しているループの実際のです。
for %i in (*) do set LIST= %i
ちょうどに設定リストを保持しています 最後のファイルが見つかります。
遅延環境変数の展開 あなたが別のを使用することができます 文字(感嘆符)へ で、環境変数を展開します 実行時間。場合は遅れ変数 拡張は、上記の、有効になっています 次のように例を書くことができます 意図したとおりに動作するように:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo If you see this, it worked ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%
他のヒント
あなたは FORする / Fコマンドを使用して行うことができます後にしている何を。
ここで私は何回も使用してきた優れたリソースです。
良い本:ティム・ヒルのWindows NTシェルスクリプト。私が持っている版は1998年に出版されたが、それはWindowsの2008年には、Windowsのコマンドプログラムのため、まだ有効です。
type *commonfilepart* >> concat_result_file
OS:Windows Server 2003で