【问题标题】:batch file: if %variable% (commands)批处理文件:if %variable%(命令)
【发布时间】:2013-03-26 10:09:27
【问题描述】:

我想使用我的 %variable% 来管理批处理文件中 IF.. THEN.. ELSE 中的条件子句。 类似于以下内容:

set variable=%%homedrive%% EQU C:
if %variable% (
   echo test ok
   ) else (
   echo test fail
   )

如果我在 cmd 控制台上写:

set test=1 equ 1
if %test% echo OK

有效!

我将在 for /f cicle 中使用它: 这是我的伪代码这是我要纠正的伪代码

(
 rem echo "%systemdrive%;;"
 echo "%%COMPUTERNAME%% EQU [x];[some parameters1]"
 echo "%%USERNAME%% NEQ [y];[some parameters2]"
 echo "%%LOGONSERVER%% EQU [z];[some parameters3]"
 [..]
) > "%temp%\CSG_fs.tmp"
[..]
for /f "usebackq tokens=1-2* delims=;" %%a in ("%temp%\CSG_fs.tmp") do (
    set cond=%%a& set cond=!cond:~1!
    set parm=%%b& set parm=!parm:~0,-1!
    echo   -   cicle: "!cond!" --^> "!parm!" 
    call if !cond! call:CSG_sub_fs !parm!
    echo    -  done
    )
goto:eof
:CSG_sub_fs
[..]
goto:eof

--编辑--

如何使用变量 !cond!决定是否执行对 CSG_sub_fs 的调用?

call if !cond! call:CSG_sub_fs !parm!

不起作用,因为它返回:“找不到指定的批次标签 - IF”

如果我使用

if !cond! call:CSG_sub_fs !parm!

它会说:“call:CSG_sub_fs not expected”

【问题讨论】:

    标签: if-statement batch-file environment-variables conditional-statements


    【解决方案1】:

    嗯——好像没有问题,所以没那么容易回答。

    你有问题

    echo "^%COMPUTERNAME^% EQU [x];[some parameters1]"
    

    因为^ 不会逃逸% - % 逃逸% - 使用%%COMPUTERNAME%%...

    (你应该可以通过TYPEing "%temp%\CSG_fs.tmp" 来检查这个

    下一个问题是

    for /f "tokens=1-2* delims=; usebackq" %%a in (%temp%\CSG_fs.tmp) do (
    

    如果%temp%\CSG_fs.tmp 不包含空格、分号或逗号,则可以处理文件%temp%\CSG_fs.tmp。如果它包含任何这些默认分隔符或某些其他具有特殊含义的字符,则必须将文件名括在双引号 "%temp%\CSG_fs.tmp" 中并使用 usebackq 选项。

    您已尝试使用usebackq,但如果使用DELIMS,则必须是LAST 选项。您的代码将设置 ";","","u","s","e","b","a","c ","k" 和 "q" 作为分隔符。

    除此之外,也许如果您解释您打算实现的目标,我们就能设计出适当的代码。


    尝试这个:
    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    CLS
    
    REM I'm setting these variables for testing.
    REM That isn't ususally a good idea but the SETLOCAL
    REM will ensure they are restored on exit
    
    SET computername=[x]
    SET logonserver=[z]
    
    
    (
     rem echo "%systemdrive%;;"
     echo "%%COMPUTERNAME%% EQU [x];[some parameters1]"
     echo "%%USERNAME%% NEQ [y];[some parameters2]"
     echo "%%LOGONSERVER%% EQU [z];[some parameters3]"
    ) > "%temp%\CSG_fs.tmp"
    for /f "usebackqtokens=1-2* delims=;" %%a in ("%temp%\CSG_fs.tmp") do (
        set cond=%%a& set "cond=IF !cond:~1! CALL :csg_sub_fs "
        set parm=%%b& set parm=!parm:~0,-1!
        CALL :varcmd "!cond!" "!parm!"
        )
    GOTO :eof
    
    :varcmd
    %~1 %~2
    GOTO :eof
    
    :csg_sub_fs
    ECHO parameters supplied to csg_sub_fs were: %*
    GOTO :eof
    

    我已强制变量名与您使用的条件相匹配,以触发子例程调用。根据需要进行更改以证明您的概念。

    不用担心不完美的英语。我敢肯定我不会用你的语言做得那么好!

    【讨论】:

    • 谢谢,我已经更正了我的代码并添加了我的问题 :) 抱歉我的英语不好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    相关资源
    最近更新 更多