0

我写了一个带有 if..else 嵌套的子程序不幸的是我不明白为什么我的代码在“ELSE”之前和之后执行(!!)我读了几个小时,但我没有发现任何错误。 。 你能帮助我吗?我复制了代码(有很多回声调试)和输出

这是我的小代码:

 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 子句之前和之后执行适当的命令!!!为什么???这东西太不可思议了!!还是我太累了?

4

2 回答 2

0

Imo 这可能并不完美,但请记住,这里没有调试服务,我不是你的父亲,卢克。

@ 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%)
    )
)
于 2013-04-04T23:37:38.953 回答
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% " (

因为解析器然后可以替换 CURRENT(即 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%在这些行的最后一行将具有已ownd替换的 PARSE-TIME 值,因此它不太可能包含目标字符串。这是您需要的地方,因为 !var!代码var正在更改 的值,并且您需要该changed值,而不是语句为parsed.

高温高压

于 2013-04-05T04:32:22.423 回答