2

XP のコマンド プロンプトで実行するバッチ ファイルを作成しようとしています。特定の命名規則に従う特定のパスにあるファイルのリストを取得しようとしています。各ファイル インスタンスをコピーして静的な名前に変更し、転送フォルダーにドロップする必要があります。

送信フォルダにファイルが入るまで少し時間がかかることがあるので、前のファイルと重ならないように、次のファイルをコピーする前に確認する必要があります。追加のツールキットがインストールされていないため、SLEEPまたはを使用できません。ファイルが送信されるまでTIMEOUT、セクションにループバックし続けるようにしています。START

%%xループに値セットを渡すforと、セクションに数回ループバックすると、STARTその値が失われ、何も設定されないことに気付きました。そこで、値を保持する変数を設定しようとしました。

変数が正しく設定されていない、またはクリアされていないという問題があるようです。元々は最初のファイルを参照し続けていましたが、現在はまったく設定されていないようです。はECHO正しい値を表示しますが、filename変数はまだ空です。

これを行うより良い方法を知っている人はいますか?私はすでにこれに丸一日を無駄にしているので、あなたの助けを前もって感謝します!

これはバッチ ファイルです。

@ECHO "At the start of the loop" 
@for %%x in (C:\OUTBOUND\customer_file*) do (
@ECHO "In the loop" 
@ECHO "loop value =" 
@ECHO %%x
SET filename=%%x
@ECHO "filename ="
@ECHO %filename%
@ECHO ...ARCHIVE OUTBOUND CUSTOMER FILE
archivedatafile --sourcefile="%filename%" --archivefolder="..\archivedata\customer" --retentiondays=0
IF NOT %ERRORLEVEL%==0 GOTO ERROR
PAUSE
:START
IF EXIST l:\OutputFile (
@ping 1.1.1.1 -n 1 -w 30000
GOTO START
) ELSE (
COPY %filename% l:\OutputFile /Y
IF NOT %ERRORLEVEL%==0 GOTO ERROR
PAUSE
)
)
GOTO END
:ERROR
@echo off
@ECHO *************************************************************
@ECHO *                      !!ERROR!!                            *
@ECHO *************************************************************
:END
SET filename=
4

3 に答える 3

4

foxidrive は、動作するはずのスクリプトを提供していますが、コードが失敗する理由と、問題をどのように修正したかについては説明していません。

2 つの問題があります。

1) ループ内で GOTO が実行されるたびに、FOR ループはすぐに中止されます。GOTO ターゲット ラベルが配置されている場所は問題ではありません。GOTO は常にループを終了します。Foxidrive の CALL の使用は完全に機能します。CALL されたルーチンが戻ると、ループが続行されます。

2) コード ブロック内で変数を設定し、同じブロック内で新しい値を参照しようとしています。%VAR%ステートメントが解析されるときに展開され、IF や FOR などの複雑なコマンドは、1 回のパスで全体が一度解析されます。実際には、括弧内のコード ブロックはすべて 1 回のパスで解析されます。したがって、 と の値は定数になります。つまり、ブロックに入る前に存在していた値です%ERRORLEVEL%%FILENAME%

Endoro が示したように、その問題を解決する 1 つの方法は、遅延展開を使用することです。を使用して遅延展開を有効にしてsetlocal enableDelayedExpansionから、 を使用して変数を展開する必要があります!VAR!。値は、解析時ではなく実行時に展開されます。HELP SET遅延展開の詳細については、コマンド プロンプトから入力してください。

ただし、遅延展開は FOR 変数展開の後に発生するため、FOR ループで使用すると、遅延展開自体が問題を引き起こす可能性があることに注意してください。%%x値に!. この問題は、SETLOCAL と ENDLOCAL を使用して、必要に応じて遅延展開のオンとオフを慎重に切り替えることで解決できます。

Foxidrive のコードは、CALL を使用することで、展開の遅延の問題全体を回避します。彼の :NEXT ルーチンは FOR ループ内にないため、呼び出されるたびにすべてのコマンドが再解析されるため、遅延展開は必要ありません。

于 2013-05-23T11:38:40.497 に答える