2012-01-13 110 views
0

在DOS脚本,我写的,我无法弄清楚是什么原因导致这个错误,我得到:Dos批处理脚本错误?时发生错误,而处理:.EXE

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 
+1

这是什么都使用PowerShell做什么? – 2012-01-13 07:47:17

+0

删除了powershell标记 – manojlds 2012-01-13 08:05:24

+0

你应该用几句话解释一下这个脚本正在做什么。你也应该在代码中添加注释。你得到的错误是否有一件麻布? – Tom 2012-01-13 08:10:14

回答

3

删除查找和TYPE

的.EXE你不需要TYPE。你可以这样做只是这一点:

FOR /F "tokens=*" %%A IN (`FIND /N /I "%_PROPKEY%=" "%_FILE%.bak"`) DO (

如果寻找败坏你的结果(不使用TYPE),那么可以考虑使用FINDSTR,而不是和使用 'DELIMS =:' 而不是'DELIMS = ]

如果我是对我的假设,以下是有帮助的,看看在” MORE + NNN“命令(注意” + NNN',其输出来自文件中特定位置的行)。

为什么不把你的'SETLOCAL ENABLE .. etc'放在代码的顶部?

如果你解释你试图尝试的是什么,那么我可能处于更有利的位置。

只是一些想法:)

+0

感谢mucho。我尝试了所有这些事情。 SETLOCAL位于其特定位置,这是为了使该功能正常工作的原因。此外,我试图避免SETLOCAL除了在其代码所在的代码区域,因为我想在其他脚本中重用此函数。我会用你的建议更新我的问题,但它不能解决问题。 – djangofan 2012-01-14 20:38:51

+0

好吧,你是对的。它与SETLOCAL有关。我将在下面发布工作代码作为额外的答案。 – djangofan 2012-01-14 20:49:25

+1

实际上,'FIND' *是一个可执行文件,因此应该将其称为'find.exe'。但'type'是一个内部命令,所以不需要'type.exe',只需'type',就可以了。 – 2012-01-14 22:44:19

0

这里是让保罗托马西一些帮助后的工作代码:

@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