Batch file 作用域如何在.cmd文件中工作?
我有一个.cmd文件脚本,我运行它来检查用户是否在广告组中 过程是这样的: 更新他们的广告群列表 检查他们是否有正确的组来安装应用程序 如果函数结果为N,则跳到下一个检查 这是我的剧本:Batch file 作用域如何在.cmd文件中工作?,batch-file,command,Batch File,Command,我有一个.cmd文件脚本,我运行它来检查用户是否在广告组中 过程是这样的: 更新他们的广告群列表 检查他们是否有正确的组来安装应用程序 如果函数结果为N,则跳到下一个检查 这是我的剧本: REM ======== SET variables ======== SET @ADGroups=C:\APPS\%USERNAME%\ADGroups.txt REM ======== update AD groups ======== gpresult /r > %@ADGroups%
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
)
出于某种原因,@InGroupYN始终作为Y运行,而不管函数返回的是true还是false
命令行中的变量是否需要考虑某些作用域?无需更改结构 如果定义如下,为什么不使用: Rem===========设置变量======== 设置@ADGroups=C:\APPS\%UserName%\ADGroups.txt Rem========更新广告组======== GPResult/R>%@ADGroups% Rem=APP1========= 呼叫:检查ADU组App1名称 如果定义为@InGroupYN 电话:安装应用程序 Rem=APP2========= 呼叫:检查ADU组App2名称 如果定义为@InGroupYN 电话:安装应用程序 然后使用条件集删除不必要的For循环和If/Else: 雷姆--------------------------- Rem-AD组中的功能检查 雷姆--------------------------- :检查组 Rem===========未定义变量======== 设置@InGroupYN= Rem========如果匹配,则设置为“是”======= FindStr/IRC:%~1%@ADGroups%>num&&Set@InGroupYN=Y 后藤:EOF
你能给我解释一下这是如何工作的,或者链接到一个我可以阅读的源代码,因为我对语法不太熟悉-顺便说一句,这工作得非常好!ThanksA变量只有在有值时才被定义,Set@InGroupYN=通过显式地不给它任何值来确保没有%@InGroupYN%变量是一个条件执行器,它的意思是“如果最后一个命令成功”。它有一个相反的| |意思是“如果最后一个命令不成功”。并非每个命令都报告成功或其他情况相同,FindStr是报告成功的命令。谢谢。最后一个问题。为什么Findstr不需要像我以前那样进行for循环?因为你没有保存它的返回值,只需要它的成功或其他。我认为你的代码应该可以工作,我找不到任何错误。你是否希望广告组能敏感地匹配案例?
::--------------------------------------------------------
::-- 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