-1

そもそも、私はバッチ ファイルを使用するのに十分なほど怒っていると思いますが、この問題は私の髪を引き裂きます! 以下のバッチ スクリプトは、通常は問題なく動作します。ただし、最初の実行時に「コマンドの構文が正しくありません」というエラーが表示されます。そして、私REMがすべてを出し切るまでこれを行い、それを実行してから、それを解除REMします。その後、魔法のように再び機能し始めます!

@echo off

REM Create processed data directory
set "PROCDIR=processed"
mkdir %PROCDIR% 2>nul

REM Loop through CSV files and process them
for %%f in (*.csv) do (
  set "in=%%~nf"
  set "input=%%~nxf"
  set "out_lang=%PROCDIR%\%in%_lang.csv"
  set "out_spr=%PROCDIR%\%in%_spr.csv"
  set "out_ajt=%PROCDIR%\%in%_ajt.csv"

  echo Processing %input%

  REM Split input file appropriately
  REM FIXME Hardcoded line ranges are brittle
  sed -n "1,2p"  %input% > %out_lang%
  sed -n "3,55p" %input% > %out_spr%.tmp
  sed -n "56,$p" %input% > %out_ajt%.tmp

  REM Unpack SPR data
  REM n.b., Needs gawk 4, or later
  gawk -f spr.awk %out_spr%.tmp > %out_spr%
  del %out_spr%.tmp

  REM Substitute AJT data values
  REM n.b., -i seems to be buggy in Windows
  sed -f ajt.sed %out_ajt%.tmp > %out_ajt%
  del %out_ajt%.tmp
)

REM@echo off. そして、 になるとsed、ただあきらめます。

私は何かが足りないと思います...それが何であるかについてのアイデアはありますか!? (私のビー玉以外にも!)

4

2 に答える 2

2

アドバイスがあれば、PAUSEコマンドを使用して悪用し、その中のECHO文字をエスケープ^してください。また、Ctrl-C を使用して、実行中にスクリプトを停止しますPAUSE

デバッグされたバージョンは次のとおりです。

@echo off

SETLOCAL
REM Create processed data directory
set "PROCDIR=processed"
echo mkdir %PROCDIR% 2^>nul

REM Loop through CSV files and process them
for %%F in (*.csv) do (
  set "in=%%~nF"
  echo in: %in%
  set "input=%%~nxF"
  echo input: %input%
  set "out_lang=%PROCDIR%\%in%_lang.csv"
  set "out_spr=%PROCDIR%\%in%_spr.csv"
  set "out_ajt=%PROCDIR%\%in%_ajt.csv"

  echo Processing %input%
PAUSE

  REM Split input file appropriately
  REM FIXME Hardcoded line ranges are brittle
  echo sed -n "1,2p"  %input% ^> %out_lang%
  echo sed -n "3,55p" %input% ^> %out_spr%.tmp
  echo sed -n "56,$p" %input% ^> %out_ajt%.tmp
PAUSE

  REM Unpack SPR data
  REM n.b., Needs gawk 4, or later
  echo gawk -f spr.awk %out_spr%.tmp ^> %out_spr%
  echo del %out_spr%.tmp
PAUSE

  REM Substitute AJT data values
  REM n.b., -i seems to be buggy in Windows
  echo sed -f ajt.sed %out_ajt%.tmp ^> %out_ajt%
  echo del %out_ajt%.tmp
PAUSE

)
ENDLOCAL
GOTO :EOF
EXIT /B 0

追加setlocal enabledelayedexpansionしましたが、これは宣言されていない変数エラーを解決するようです。

これが作業バージョンです(すべての冗長echoとキャレットを削除する必要があります^):

@echo off
setlocal enabledelayedexpansion

REM Create processed data directory
set "PROCDIR=processed"
echo mkdir %PROCDIR% 2^>nul

REM Loop through CSV files and process them
for %%F in (*.csv) do (
  set "in=%%~nF"
  echo in: !in!
  set "input=%%~nxF"
  echo input: !input!
  set "out_lang=!PROCDIR!\!in!_lang.csv"
  set "out_spr=!PROCDIR!\!in!_spr.csv"
  set "out_ajt=!PROCDIR!\!in!_ajt.csv"

  echo Processing !input!
PAUSE

  REM Split input file appropriately
  REM FIXME Hardcoded line ranges are brittle
  echo sed -n "1,2p"  !input! ^> !out_lang!
  echo sed -n "3,55p" !input! ^> !out_spr!.tmp
  echo sed -n "56,$p" !input! ^> !out_ajt!.tmp
PAUSE

  REM Unpack SPR data
  REM n.b., Needs gawk 4, or later
  echo gawk -f spr.awk !out_spr!.tmp ^> !out_spr!
  echo del !out_spr!.tmp
PAUSE

  REM Substitute AJT data values
  REM n.b., -i seems to be buggy in Windows
  echo sed -f ajt.sed !out_ajt!.tmp ^> !out_ajt!
  echo del !out_ajt!.tmp
PAUSE

)
endlocal
GOTO :EOF
EXIT /B 0
于 2015-09-11T23:13:30.790 に答える
1

Stephanの言うとおりです。FORループ内で遅延展開を使用していないため、バッチ コードは機能しません。

@echo off
setlocal EnableDelayedExpansion
REM Create processed data directory
set "PROCDIR=processed"
mkdir "%PROCDIR%" 2>nul

REM Loop through CSV files and process them
for %%f in (*.csv) do (
  set "in=%%~nf"
  set "input=%%~nxf"
  set "out_lang=%PROCDIR%\!in!_lang.csv"
  set "out_spr=%PROCDIR%\!in!_spr.csv"
  set "out_ajt=%PROCDIR%\!in!_ajt.csv"

  echo Processing !input!

  REM Split input file appropriately
  REM FIXME Hardcoded line ranges are brittle
  sed -n "1,2p"  "!input!" >"!out_lang!"
  sed -n "3,55p" "!input!" >"!out_spr!.tmp"
  sed -n "56,$p" "!input!" >"!out_ajt!.tmp"

  REM Unpack SPR data
  REM n.b., Needs gawk 4, or later
  gawk -f spr.awk "!out_spr!.tmp" >"!out_spr!"
  del "!out_spr!.tmp"

  REM Substitute AJT data values
  REM n.b., -i seems to be buggy in Windows
  sed -f ajt.sed "!out_ajt!.tmp" >"!out_ajt!"
  del "!out_ajt!.tmp"
)
endlocal

(...によって定義されたブロック内で参照されるすべての環境変数)は、コマンド プロセッサによって既にブロック全体の解析中に展開されます。の実行時にコマンド プロンプト ウィンドウに出力されるヘルプ ページの 1 つで、そのif /?詳細が説明されています。

これは、コマンド プロンプト ウィンドウ内から最初の行を指定せずに問題のバッチ コードを実行した場合に発生する可能性があります。期待どおりに動作しないバッチ コードをデバッグするには、コマンド プロンプト ウィンドウ内からバッチ ファイルを実行するecho off必要があります。echo on

また、現在のディレクトリにある CSV ファイルのファイル名に 1 つ以上のスペースが含まれている場合は、すべてのファイル参照を二重引用符で囲んで、そのようなファイルに対しても作業コードを作成する必要があります。

于 2015-09-12T11:50:01.957 に答える