1

私は Perl プログラマですが、特定のタスクのために Windows バッチ ファイルを作成する必要があります。

スクリプトは、入力ファイルを 1 行ずつ読み取り、出力ファイルにコピーする必要があります。ただし、途中で出力ファイルを切り替える必要があります。

一般的に、入力ファイルの読み取りとファイルへの出力については、Jeb による次の記事のソリューションが最適に機能するようです。(入力データに変な文字や長い行が含まれている場合、他のソリューションはうまく機能しません)バッチ ファイル: ファイルの読み取り方法は?

ただし、途中で出力ファイルを変更すると機能しません。問題はおそらく DelayedExpansion の動作方法にあります。

次のスクリプトを実行すると、最後の outfile はまだ a.txt であり、new_variable は設定されていません。

@echo off
del /f/q a.txt
del /f/q b.txt
del /f/q c.txt
del /f/q out.txt

set outfile=a.txt
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    IF "!%var!" == "/************************** PLUGINS SECTION *************************/" (
   set outfile=b.txt
   set new_variable=this
   echo "FOUND! Value of outfile should change to b.txt"
  )
  echo( !outfile! !var! >>!outfile!
    ENDLOCAL
)

echo Outfile:      %outfile%
echo New Variable: %new_variable%
4

1 に答える 1

1

エンドローカルの後で変数の変更を失います。したがって、バリア
を超えて値を保存する必要があります。 ここで最も簡単な方法は、テクニックを使用することです。endlocal
FOR-Endlocal

 SETLOCAL DisableDelayedExpansion
 FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    if "!var!" == "****" (
      set outfile=b.txt
      set new_variable=this
    )
  FOR /F "tokens=1,2" %%O in (!outfile! !new_variable!) DO
  (
    ENDLOCAL
    set "outfile=%%O"
    set new_variable=%%P
  )
)

これは、FORループの%%Oおよび%%Pパラメーターがの影響を受けないために機能しますENDLOCAL
両方の値がバリアを越えてキャッシュされます。

于 2012-07-10T07:23:15.887 に答える