2013-04-04 2 views
0

Я написал подпрограмму с некоторыми if..else вложенными К сожалению, я не могу понять, почему мой код выполняется до и после «ELSE» (! !) Я читаю его часами, но я не нахожу ошибки. Вы можете мне помочь? Я скопировал код (с большим количеством эхо-команд отладки) и выходbatch: if..then..else inested make me mad

Это мой маленький код:

setlocal 
set debug=echo 
%debug% # %~0: %* 
for /f "usebackq tokens=1-3 delims=;" %%a in ('"%*"') do (set dir=%%~a& set own=%%~b) 
%debug% - dir="!dir!" 
%debug% - own="!own!" 
%debug% -+ analisi cartella: "!dir!" 
if exist "!dir!" (
    %debug% x la cartella esiste già, passo oltre 
    ) else (
    %debug% - la cartella non esite quindi la creo 
    mkdir "!dir!" || echo [E] non sono riuscito a creare la cartella&& echo %err3_txt% [dir:!dir!] 1>&2 && exit %err3_id% 
    ) 
%debug% -+ analisi proprietario: "!own!" 
for /f "usebackq tokens=1,2 delims=\" %%x in ('"!own!\\"') do (set own1=%%~x& set own2=%%~y) 
if [!own!] equ [!own:~0,1! ] (
    %debug% x il proprietario non è stato specificato quindi non va cambiato, passo oltre 
    ) else (
    %debug% - own1: "!own1!" 
    %debug% - own2: "!own2!" 
    if [%own2%] equ [] (
    %debug% - il proprietario ha un dominio implicito, lo calcolo 
     set ownn=%own1% 
     set ownd=%userdomain% 
     ) else (
     %debug% - il proprietario ha un dominio esplicitamente indicato 
     set ownd="input non valido" 
     if /i [!own1!] equ [L] set ownd=%computername% 
     if /i [!own1!] equ [D] set ownd=%userdomain% 
     if "%ownd%" equ "input non valido" (echo [E] il dominio esplitamente indicato non è riconosciuto: !own1!& echo %err4_txt% [dir:!dir!][own:!own!] 1>&2 & exit %err4_id%) 
     ) 
    %debug% - la configurazione prevede l'impostazione del seguente proprietario: !ownd!\!ownn! 
    ) 
%debug% x done. 

это мой выход:

# :CSG_check_fs: C:; ; 

- dir="C:" 

- own=" " 

-+ analisi cartella: "C:" 

    x la cartella esiste giÓ, passo oltre 

-+ analisi proprietario: " " 

    x il proprietario non Þ stato specificato quindi non va cambiato, passo oltre 

    - own1: " " 

    - own2: "" 

    - il proprietario ha un dominio implicito, lo calcolo 

    - la configurazione prevede l'impostazione del seguente proprietario: CSG\  

x done. 

в частности, пусть мы выполняем соответствующие команды до и после предложения else! Почему ??? это невероятно! или я слишком устал?

+0

Попробуйте смягчиться, кто-то может принять это за громкую реакцию. –

+0

imo вы должны убить все% отладки% строк и код будет запущен :)) – Endoro

ответ

0

Это, безусловно, очень странно. CMD, кажется, имея реальную проблему с этим очень сложным утверждением (и я тоже ...):

if [!own!] equ [!own:~0,1! ] (
    %debug% x il proprietario non è stato specificato quindi non va cambiato, passo oltre 
    ) else (
    %debug% - own1: "!own1!" 
    %debug% - own2: "!own2!" 
    if [%own2%] equ [] (
    %debug% - il proprietario ha un dominio implicito, lo calcolo 
     set ownn=%own1% 
     set ownd=%userdomain% 
     ) else (
     %debug% - il proprietario ha un dominio esplicitamente indicato 
     set ownd="input non valido" 
     if /i [!own1!] equ [L] set ownd=%computername% 
     if /i [!own1!] equ [D] set ownd=%userdomain% 
     if "%ownd%" equ "input non valido" (echo [E] il dominio esplitamente indicato non è riconosciuto: !own1!& echo %err4_txt% [dir:!dir!][own:!own!] 1>&2 & exit %err4_id%) 
     ) 
    %debug% - la configurazione prevede l'impostazione del seguente proprietario: !ownd!\!ownn! 
    ) 

Глядя на

if [!own!] equ [!own:~0,1! ] (

Вы можете думать, что это должно быть оценено с OWN установлен в одном пространстве, а

if [ ] equ [ ] (

Какой должна генерировать синтаксическую ошибку, потому что третий маркер в команде является ], и это не является допустимым оператор сравнения. !var! смущает вопросы, потому что он не может быть оценен до ИСПОЛНИТЕЛЬНОГО ВРЕМЕНИ - и к тому времени парсер завершил свою работу.

Правильная форма

if "%own%" equ "%own:~0,1% " (

потому, что анализатор может затем заменить ТОК (т.е.. PARSE-TIME) значение own и синтаксис является оператором «строка в кавычках» «другая строка в кавычках»

Я уверен, что это изменение решит основную часть проблемы.

Аналогично,

if [%own2%] equ [] (

должно быть

if "%own2%" equ "" (

или даже (мое предпочтение)

if not defined own2 
  • и то же самое для других IF [..] equ [...] конструкций.

Наконец, в последовательности

 set ownd="input non valido" 
     if /i [!own1!] equ [L] set ownd=%computername% 
     if /i [!own1!] equ [D] set ownd=%userdomain% 
     if "%ownd%" equ "input non valido" (echo [E] il dominio ... 

есть небольшая проблема (кроме if..[...

ownd может быть установлен в коде, но %ownd% в последней из этих линий будет иметь значение PARSE-TIME ownd заменено, поэтому вряд ли будет содержать целевую строку. Здесь где вы НУЖНО!var!, потому что значение var изменяется кодом, и вы хотите получить значение changed, а не значение, которое было указано в отчете parsed.

HTH

+0

YEAAAA! Заменив [] на «», он работает! огромное спасибо – CSG

0

Имо это может быть не идеально, но, пожалуйста, имейте это в виду, это не дезакурация здесь. & Я не твой отец, Люк.

@ echo off&setlocal 

for /f "usebackq tokens=1-3 delims=;" %%a in ("%*") do (set dir=%%~a& set own=%%~b) 
if not exist "%dir%" mkdir "%dir%" || echo [E] non sono riuscito a creare la cartella&& echo %err3_txt% [dir:%dir%]&& exit %err3_id% 
for /f "usebackq tokens=1,2 delims=\" %%x in ("%own%\\") do (set own1=%%~x& set own2=%%~y) 

if not [%own%] equ [%own:~0,1%] (
    if [%own2%] equ [] (
     set ownn=%own1% 
     set ownd=%userdomain% 
    ) else (
     set "ownd=input non valido" 
     if /i [%own1%] equ [L] set ownd=%computername% 
     if /i [%own1%] equ [D] set ownd=%userdomain% 
     if "%ownd%" equ "input non valido" (echo [E] il dominio esplitamente indicato non è riconosciuto: %own1%& echo %err4_txt% [dir:%dir%][own:%own%]& exit %err4_id%) 
    ) 
)