【问题标题】:How does scope work in a .cmd file?范围如何在 .cmd 文件中工作?
【发布时间】:2018-04-17 14:28:31
【问题描述】:

我有一个 .cmd 文件脚本,我运行它来检查用户是否在 AD 组中。

过程是这样的:

  1. 更新他们的广告组列表
  2. 检查他们是否有正确的组来安装应用程序
  3. 如果函数的结果是N,则跳到下一个检查

这是我的脚本:

REM ======== SET variables ========
SET @ADGroups=C:\APPS\%USERNAME%\ADGroups.txt


REM ========  update AD groups ========
gpresult /r  > %@ADGroups% 


REM ======== APP1 =========
call:Check_ADGroup "App1 Name"
IF %@InGroupYN% == Y  (
    call:Install_App
) 

REM ======== APP2 =========
call:Check_ADGroup "App2 Name"
IF %@InGroupYN% == Y  (
    call:Install_App
) 

::--------------------------------------------------------
::-- Function Check In AD GROUP
::--------------------------------------------------------
:Check_ADGroup

SET @Result=[]
SET @InGroupYN=N

FOR /F "delims=" %%a in ('FINDSTR /rc:"%~1" %@ADGroups%') DO SET @Result=%%a


IF @Result == [] (
    REM ======== Set to No ======== 
    SET @InGroupYN=N

) ELSE (
    REM ======== Set to Yes ======== 
    SET @InGroupYN=Y
)
goto:eof

由于某种原因,@InGroupYN 始终以 Y 运行,无论函数返回 true 还是 false

命令行中的变量是否需要考虑一些作用域?

【问题讨论】:

  • 您的代码在我看来应该可以工作,我找不到任何严重的错误。您希望 AD 组区分大小写吗?

标签: batch-file command


【解决方案1】:

不改变你的结构……

为什么不像这样使用If Defined:

Rem ======== SET variables ========
Set "@ADGroups=C:\APPS\%UserName%\ADGroups.txt"

Rem ========  update AD groups ========
GPResult /R > "%@ADGroups%"

Rem ======== APP1 =========
Call :Check_ADGroup "App1 Name"
If Defined @InGroupYN (
    Call :Install_App
)

Rem ======== APP2 =========
Call :Check_ADGroup "App2 Name"
If Defined @InGroupYN (
    Call :Install_App
)

然后删除不必要的For循环和If/Else,改用条件Set:

Rem ------------------------------------------------------
Rem -- Function Check In AD GROUP
Rem ------------------------------------------------------
:Check_ADGroup

Rem ======== Undefine Variable ========
Set "@InGroupYN="

Rem ======= Set to Yes if match =======
FindStr /IRC:"%~1" "%@ADGroups%" >Nul && Set "@InGroupYN=Y"

GoTo :EOF

【讨论】:

  • 您能否添加有关其工作原理的解释或链接到我可以阅读的源代码,因为我对语法不太熟悉 - 顺便说一句,这真的很好!谢谢
  • 一个变量只有当它有一个值时才被定义,Set "@InGroupYN=" 通过明确地给它没有值来确保没有%@Ingroup% 变量。 && 是一个条件执行器,它的意思是“如果最后一个命令成功”。它有一个相反的 || 意思是“如果最后一个命令不成功”。 每个命令都不会报告成功或其他相同,FindStr 就是这样。
  • 感谢 Compo。最后一个问题。为什么 Findstr 不需要像我以前那样循环?
  • 因为你没有保存它的返回值,只需要它的成功或其他。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多