【问题标题】:Equal variables - Batch相等变量 - 批处理
【发布时间】:2015-01-22 03:36:26
【问题描述】:

所以,我有以下批处理脚本:

@echo off
 set /p name= 
 rem a random number, don't care about it.
 set complete_name=%name%.Creepy
 Goto STEP1
:STEP1
 echo %complete_name%|findstr /C:"9000" >nul 2>&1
 if not errorlevel 1 (
 goto 9000
 ) else ( 
 GOTO CHECK2
 )
 :CHECK2
 echo %complete_name%|findstr /C:"930" >nul 2>&1
 if not errorlevel 1 (
 goto 930
 ) else ( 
 GOTO CHECK3
 )
 :CHECK3
 echo %complete_name%|findstr /C:"310" >nul 2>&1
 if not errorlevel 1 (
 goto 310
 ) else ( 
 ECHO PROBLEM
 ) 
 :9000 
 ECHO 9000
 PAUSE
 :930
 ECHO 930
 PAUSE
 :310
 ECHO 310
 PAUSE

我希望它检查“9000”是否在变量中,对于“930”和“310”也是如此。如果这些数字都不在可变回声问题中。但是每次我运行这个脚本时,它都会转到ECHO PROBLEM,即使 9000/920/310 在%complete_name% 中。那么,这是检查一个变量是否在另一个变量中的正确方法还是有更简单的方法呢?

所以我试过这段代码:

@echo off
set name=310
set complete_name=%name%.Creepy
Goto STEP1
:STEP1
 setlocal
    if "%complete_name:9000=%"=="%complete_name%" (
      if "%complete_name:930=%"=="%complete_name%" (
        if "%complete_name:310=%"=="%complete_name%" (
        echo PROBLEM
        ) else ( 
        goto 9000
        ) 
      ) else ( 
      goto 930
      ) 
    ) else ( 
    goto 310
    )
    goto :eof

但我被困在echo problem...

【问题讨论】:

  • 不要使用GOTOs,而是尝试嵌套IF ... ( ... ) ELSE ( ... ) 方法。并学习Variable Edit/Replace
  • 事实上这对我有用。不包括你的子程序不是以exit /bgoto :eof 结尾的事实。
  • @JosefZ 我的目标不是“编辑/替换”变量。而且我不明白如何使用IF ... ( ... ) ELSE ( ... ) 而不是GOTO。 @npocmaka 这只是我尝试使用的脚本的一部分。所以我用“PAUSE”来测试它是否有效。

标签: windows variables batch-file cmd findstr


【解决方案1】:

保存下一个代码sn-p,可能命名为blabla.bat

@Echo OFF
setlocal
set complete_name=%1
if "%complete_name:9000=%"=="%complete_name%" ( 
  if "%complete_name:930=%"=="%complete_name%" ( 
    if "%complete_name:310=%"=="%complete_name%" ( 
      echo problem 
    ) else ( 
      echo valid 310
    ) 
  ) else ( 
    echo valid 930
  ) 
) else ( 
  echo valid 9000
)
Exit /B

并观察来自

的输出
blabla x9000y
blabla x930y
blabla x310y
blabla x9a0b0c0y

这是 1. 嵌套 IF ... ( ... ) ELSE ( ... ) 和 2. 使用“编辑/替换”变量的一种方式

或者,如果GOTOs 认为有必要,则与For 循环有类似的东西(也是一个很好的思考主题..)。

@Echo OFF
setlocal EnableDelayedExpansion
set complete_name=%1
for %%G in (9000 930 310) DO (
  if /I "!complete_name:%%G=!" neq "%complete_name%" GOTO :%%G
)
echo problem %complete_name%
GOTO :commonEnd
:9000
  Echo valid 9000 %complete_name%
  GOTO :commonEnd
:930
  Echo valid 930 %complete_name%
  GOTO :commonEnd
:310
  Echo valid 310 %complete_name%
  GOTO :commonEnd
:commonEnd

【讨论】:

  • 您的编辑有问题:嵌套应遵循下一个模式(外部项应对应):A B C ... C B A。你的模式是A B C ... A B C(实例化:9000 930 310 ... 9000 930 310)。另请参阅我的编辑,请注意GOTO :commonEnd ...
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2010-12-17
  • 2019-08-22
相关资源
最近更新 更多