0

我想使用我的 %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”

4

1 回答 1

0

嗯 - 似乎没有问题,所以回答起来并不容易。

你有问题

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”、“ se、“ 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

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

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

于 2013-04-04T12:09:39.003 回答