2012-01-13 4 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? –

+0

Удаленный ярлык powershell – manojlds

+0

Вы должны объяснить в нескольких фразах, что делает этот скрипт. Также вы должны добавить комментарии в свой код. Есть ли длина прошивки для ошибки? – Tom

ответ

3

Снимите .EXE ФИНД и TYPE

Вам не нужно TYPE. Вы можете сделать только это:

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

Если FIND портит результаты (не используя TYPE), а затем рассмотреть вопрос об использовании FINDSTR вместо и использовать 'DELIMS =:' вместо 'DELIMS = ] «

Если я прав мое предположение о том, что следующий полезно, посмотрите на» MORE + NNN «команды (обратите внимание на» + NNN ', который выводит строки из определенного места в файле).

Почему бы не просто разместить свой «SETLOCAL ENABLE .. и т. Д.» В верхней части вашего кода?

Если вы объясните, что именно вы пытаетесь попытаться, то я могу быть в лучшем положении, чтобы помочь.

Просто несколько мыслей :)

+0

Спасибо много. Я пробовал все это. SETLOCAL находится в своем конкретном месте, чтобы заставить работу работать правильно. Кроме того, я пытаюсь избежать SETLOCAL, за исключением областей кода, где это необходимо, потому что я хочу повторно использовать эту функцию в других сценариях.Я обновляю свой вопрос с вашими предложениями, но он не решает проблемы. – djangofan

+0

Хорошо, вы были правы. Это как-то связано с SETLOCAL. Я отправлю рабочий код в качестве дополнительного ответа ниже. – djangofan

+1

Собственно, 'FIND' * является * исполняемым, поэтому он должен быть прав, чтобы называть его' find.exe'. Но 'type' является внутренней командой, поэтому нет' type.exe', просто 'type', well spot. –

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