不一致 "The syntax of the command is incorrect" 错误
Inconsistent "The syntax of the command is incorrect" error
我猜我一开始就气到要使用批处理文件,但这个问题让我抓狂了!下面的批处理脚本 usually 工作得很好。但是,在第一个 运行 上它会给出一个 "The syntax of the command is incorrect" 错误;它会一直这样做,直到我 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
时,它就放弃了。
我想我遗漏了什么...知道它可能是什么!? (除了我的弹珠!)
如果我能提供建议,请使用和滥用 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
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
在由 (
... )
定义的块中引用的每个环境变量都由已经在解析整个块的命令处理器扩展。在执行 if /?
时输出到命令提示符 window 的帮助页面之一详细解释了这一点。
这可以在 运行 有问题的批处理代码上看到,没有命令提示符 window 中的第一行。 运行 命令提示符 window 中没有 echo off
或带有 echo on
的批处理文件应该用于调试未按预期工作的批处理代码。
如果当前目录中的任何 CSV 文件在文件名中包含 1 个或多个空格,则有必要将所有文件引用用双引号引起来,以便此类文件也具有工作代码。
我猜我一开始就气到要使用批处理文件,但这个问题让我抓狂了!下面的批处理脚本 usually 工作得很好。但是,在第一个 运行 上它会给出一个 "The syntax of the command is incorrect" 错误;它会一直这样做,直到我 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
时,它就放弃了。
我想我遗漏了什么...知道它可能是什么!? (除了我的弹珠!)
如果我能提供建议,请使用和滥用 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
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
在由 (
... )
定义的块中引用的每个环境变量都由已经在解析整个块的命令处理器扩展。在执行 if /?
时输出到命令提示符 window 的帮助页面之一详细解释了这一点。
这可以在 运行 有问题的批处理代码上看到,没有命令提示符 window 中的第一行。 运行 命令提示符 window 中没有 echo off
或带有 echo on
的批处理文件应该用于调试未按预期工作的批处理代码。
如果当前目录中的任何 CSV 文件在文件名中包含 1 个或多个空格,则有必要将所有文件引用用双引号引起来,以便此类文件也具有工作代码。