Batch file Dos批处理脚本错误?处理时出错:.exe
在我编写的DOS脚本中,我无法找出导致此错误的原因:Batch file Dos批处理脚本错误?处理时出错:.exe,batch-file,dos,properties-file,Batch File,Dos,Properties File,在我编写的DOS脚本中,我无法找出导致此错误的原因: The system cannot find the file specified. Error occurred while processing: .exe. 这是剧本。任何帮助都将不胜感激。我试图在DosTips论坛上寻求帮助,但没有得到答复 @echo off :: script to edit property files CALL :PROPEDIT # Key4 Value446 test.properties GOT
The system cannot find the file specified.
Error occurred while processing: .exe.
这是剧本。任何帮助都将不胜感激。我试图在DosTips论坛上寻求帮助,但没有得到答复
@echo off
:: script to edit property files
CALL :PROPEDIT # Key4 Value446 test.properties
GOTO :END
:PROPEDIT [#] PropKey PropVal File
IF "%~1"=="#" (
:: Passing a first argument of "#" will disable the line while editing
SET "_PREFIX=#"
SHIFT
)
IF NOT "%~4"=="" (
ECHO Too many arguments.
EXIT /B 1
)
IF "%~3"=="" (
ECHO PROPEDIT: Function requires 3 args: [#] PropKey PropVal File
EXIT /B 1
) ELSE (
SET "_PROPKEY=%~1"
SET "_PROPVAL=%~2"
SET "_FILE=%~3"
)
MOVE /Y "%_FILE%" "%_FILE%.bak">nul
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%_FILE%.bak" ^|FINDSTR /N /I "%_PROPKEY%="`) DO (
SET LINE=%%A
)
FOR /F "tokens=1,2* delims=:" %%S IN ("%LINE%") DO SET LINE=%%S
SET /A COUNT=1
FOR /F "USEBACKQ delims=" %%A IN (`TYPE "%_FILE%.bak" ^|FIND /V /N ""`) DO (
SET "LN=%%A"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "LN=!LN:*]=!"
IF "!COUNT!" NEQ "%LINE%" (
ECHO(!LN!>>%_FILE%
) ELSE (
ECHO %_PREFIX%%_PROPKEY%=%_PROPVAL%>>%_FILE%
ECHO Updated '%_FILE%' with value '%_PREFIX%%_PROPKEY%=%_PROPVAL%'.
)
ENDLOCAL
SET /A COUNT+=1
)
EXIT /B 0
:END
ECHO --- Finished Test ---
pause
删除FIND和TYPE的.EXE 您不需要键入。您可以这样做:
FOR /F "tokens=*" %%A IN (`FIND /N /I "%_PROPKEY%=" "%_FILE%.bak"`) DO (
如果<强>查找< /强>损坏您的结果(不使用<强>类型< /强>),则应考虑使用<强> FordSTR> <强>,并使用“<强> Delims=:”代替“<强> Delims=”<强> > /P> 如果我的假设是正确的,那么请看一下“MORE+nnn”命令(注意“+nnn”,它从文件中的特定位置输出行)
为什么不把“setlocalenable..etc”放在代码的顶部呢 如果你解释一下你想尝试什么,那么我可能会更好地提供帮助只是一些想法:)删除FIND和TYPE的.EXE 您不需要键入。您可以这样做:
FOR /F "tokens=*" %%A IN (`FIND /N /I "%_PROPKEY%=" "%_FILE%.bak"`) DO (
如果<强>查找< /强>损坏您的结果(不使用<强>类型< /强>),则应考虑使用<强> FordSTR> <强>,并使用“<强> Delims=:”代替“<强> Delims=”<强> > /P> 如果我的假设是正确的,那么请看一下“MORE+nnn”命令(注意“+nnn”,它从文件中的特定位置输出行)
为什么不把“setlocalenable..etc”放在代码的顶部呢 如果你解释一下你想尝试什么,那么我可能会更好地提供帮助以下是获得Paul Tomasi帮助后的工作代码:
@echo off
SETLOCAL DISABLEDELAYEDEXPANSION
CALL :PROPEDIT # Key4 Value446 test.properties
GOTO :END
:PROPEDIT [#] PropKey PropVal File
IF "%~1"=="#" (
:: Passing a first argument of "#" will disable the line while editing
SET "_PREFIX=#"
SHIFT
)
IF NOT "%~4"=="" (
ECHO Too many arguments.
EXIT /B 1
)
IF "%~3"=="" (
ECHO PROPEDIT: Function requires 3 args: [#] PropKey PropVal File
EXIT /B 1
) ELSE (
SET "_PROPKEY=%~1"
SET "_PROPVAL=%~2"
SET "_FILE=%~3"
)
MOVE /Y "%_FILE%" "%_FILE%.bak">nul
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%_FILE%.bak" ^|FINDSTR /N /I "%_PROPKEY%="`) DO (
SET LINE=%%A
)
FOR /F "tokens=1,2* delims=:" %%S IN ("%LINE%") DO SET LINE=%%S
SET /A COUNT=1
FOR /F "USEBACKQ delims=" %%A IN (`TYPE "%_FILE%.bak" ^|FIND /V /N ""`) DO (
SET "LN=%%A"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "LN=!LN:*]=!"
IF "!COUNT!" NEQ "%LINE%" (
ECHO(!LN!>>%_FILE%
) ELSE (
ECHO %_PREFIX%%_PROPKEY%=%_PROPVAL%>>%_FILE%
ECHO Updated '%_FILE%' with value '%_PREFIX%%_PROPKEY%=%_PROPVAL%'.
)
SETLOCAL DISABLEDELAYEDEXPANSION
SET /A COUNT+=1
)
EXIT /B 0
:END
ECHO --- Finished Test ---
pause
以下是获得Paul Tomasi帮助后的工作代码:
@echo off
SETLOCAL DISABLEDELAYEDEXPANSION
CALL :PROPEDIT # Key4 Value446 test.properties
GOTO :END
:PROPEDIT [#] PropKey PropVal File
IF "%~1"=="#" (
:: Passing a first argument of "#" will disable the line while editing
SET "_PREFIX=#"
SHIFT
)
IF NOT "%~4"=="" (
ECHO Too many arguments.
EXIT /B 1
)
IF "%~3"=="" (
ECHO PROPEDIT: Function requires 3 args: [#] PropKey PropVal File
EXIT /B 1
) ELSE (
SET "_PROPKEY=%~1"
SET "_PROPVAL=%~2"
SET "_FILE=%~3"
)
MOVE /Y "%_FILE%" "%_FILE%.bak">nul
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE "%_FILE%.bak" ^|FINDSTR /N /I "%_PROPKEY%="`) DO (
SET LINE=%%A
)
FOR /F "tokens=1,2* delims=:" %%S IN ("%LINE%") DO SET LINE=%%S
SET /A COUNT=1
FOR /F "USEBACKQ delims=" %%A IN (`TYPE "%_FILE%.bak" ^|FIND /V /N ""`) DO (
SET "LN=%%A"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "LN=!LN:*]=!"
IF "!COUNT!" NEQ "%LINE%" (
ECHO(!LN!>>%_FILE%
) ELSE (
ECHO %_PREFIX%%_PROPKEY%=%_PROPVAL%>>%_FILE%
ECHO Updated '%_FILE%' with value '%_PREFIX%%_PROPKEY%=%_PROPVAL%'.
)
SETLOCAL DISABLEDELAYEDEXPANSION
SET /A COUNT+=1
)
EXIT /B 0
:END
ECHO --- Finished Test ---
pause
这与powershell有什么关系?您应该用几句话解释此脚本的作用。此外,您确实应该在代码中添加注释。您得到的错误是否有行号?@Tom您一定是疯了:)批处理脚本调试是非常痛苦的。您在上面灰色框中看到的错误可能是OP看到的所有错误。这是一次可怕的经历。这就是为什么理解脚本应该做什么如此重要。如果可以的话,我建议您使用powershell。Tom,批处理文件错误中没有行号。当然,您可以删除
echo off
以查看它发生在何处,但遗憾的是,没有人这样做。那么,在一堵代码墙中为我们找出一个随机错误会有什么乐趣呢?:)-(编辑添加,这是非常干净的代码就批处理文件而言,所以忽略明显的调试步骤实际上让我感到惊讶)。似乎我不再习惯批处理文件^^@linuxuser27代码的目的使我更容易阅读代码。我不必阅读和理解每一行代码(或运行它)来发现错误。但这只是我…这与powershell有什么关系?您应该用几句话解释这个脚本在做什么。此外,您确实应该在代码中添加注释。您得到的错误是否有行号?@Tom您一定是疯了:)批处理脚本调试是非常痛苦的。您在上面灰色框中看到的错误可能是OP看到的所有错误。这是一次可怕的经历。这就是为什么理解脚本应该做什么如此重要。如果可以的话,我建议您使用powershell。Tom,批处理文件错误中没有行号。当然,您可以删除echo off
以查看它发生在何处,但遗憾的是,没有人这样做。那么,在一堵代码墙中为我们找出一个随机错误会有什么乐趣呢?:)-(编辑添加,这是非常干净的代码就批处理文件而言,所以忽略明显的调试步骤实际上让我感到惊讶)。似乎我不再习惯批处理文件^^@linuxuser27代码的目的使我更容易阅读代码。我不必阅读和理解每一行代码(或运行它)来发现错误。但这只是我…非常感谢。我都试过了。SETLOCAL位于其特定位置是为了使函数正常工作。此外,我试图避免SETLOCAL,除非在代码中有必要,因为我希望在其他脚本中重用此函数。我会用你的建议更新我的问题,但它不能解决问题。好吧,你是对的。这和当地的环境有关。我将把工作代码作为一个额外的答案发布在下面。实际上,FIND
是一个可执行文件,因此将其称为FIND.exe
应该是有效的。但是type
是一个内部命令,所以没有type.exe
,只有type
,很好。非常感谢。我都试过了。SETLOCAL位于其特定位置是为了使函数正常工作。此外,我试图避免SETLOCAL,除非在代码中有必要,因为我希望在其他脚本中重用此函数。我会用你的建议更新我的问题,但它不能解决问题。好吧,你是对的。这和当地的环境有关。我将把工作代码作为一个额外的答案发布在下面。实际上,FIND
是一个可执行文件,因此将其称为FIND.exe
应该是有效的。但是type
是一个内部命令,所以没有type.exe
,只有type
,很好。