2013-04-04 50 views
0

我已經寫了一些if..else嵌套的子例程 不幸的是我不明白爲什麼我的代碼在「ELSE」(!)之前和之後執行(! !) 我讀了幾個小時,但我沒有發現任何錯誤..你能幫助我嗎? 我複製的代碼(有很多回聲(1)調試中)和輸出批處理:if..then..else nested讓我生氣

這是我的一點代碼:

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

試着淡化一下,有人會誤認爲這是一個咆哮。 – 2013-04-04 22:53:24

+0

你應該殺死所有%debug%行並且代碼將運行:)) – Endoro 2013-04-04 23:05:18

回答

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 [ ] (

這應該產生一個語法錯誤,因爲該命令中的第三個令牌是]這不是一個有效的比較,OPER ATOR。 !var!混淆了事情,因爲直到執行時間才能評估它 - 到那時,解析器已完成其工作。

正確的形式是

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

因爲解析器可接着替代電流(Ie。分析時)的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%ownd的PARSE-TIME值被取代,所以它不太可能包含目標字符串。,因爲代碼將更改var的值,並且您希望changed的值,而不是語句爲parsed時的值。

HTH

+0

YEAAAA!替換[]與「」它工作!非常感謝 – CSG 2013-04-05 08:01:25

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%) 
    ) 
)