2012-01-13 83 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