Batch file Dos批处理脚本错误?处理时出错:.exe

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

在我编写的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    
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
,很好。