2017-02-15 83 views
-1

我试图编写一个脚本,在脚本执行后,从服务器列表中的哪个位置显示Windows“已许可”或“未经许可”。我已经编写了这个脚本,但问题是,未激活的服务器也会给出“许可”输出。获取所有“已激活”和“未激活”Windows服务器的列表

这里是脚本 -

@echo off 

Set RESULTFILE=C:\users\v7t7adm\desktop\result.txt 

Set SERVERLIST=C:\users\v7t7adm\desktop\server.txt 

:START-SCRIPT 
@for /F "tokens=1-10 delims=" %%a in ('type %SERVERLIST%') do (

Set SERVERNAME=%%a 
Call :SCRIPT 

) 

:SCRIPT 

@for /F "tokens=1-10 delims=:" %%a in ('cscript c:\Windows\System32\slmgr.vbs %SERVERNAME% /dli ^| findstr /I /C:"License Status:"') do Set STATUS=%%b 

Call :ECHO-RESULT 

Goto :EOF 

:ECHO-RESULT 

IF %STATUS% neq "Licensed " set %STATUS% = "Not Licensed" 

echo %SERVERNAME% - %STATUS% >> %RESULTFILE% 

echo %SERVERNAME% - %STATUS% 

Goto :EOF 

当我远程运行的 “cscript C:\ WINDOWS \ SYSTEM32 \ slmgr.vbs的SERVERNAME%%/ DLI” 未激活的服务器上,它提供了一个输出作为 -

连到服务器X

(空白)

所需的输出是 -

服务器X - 未获得许可

服务器Ÿ - 许可

但我得到的输出 -

服务器X - 许可

服务器ÿ - 许可

+0

由于输出是空的,的'%的值STATUS%'没有被改变,只是报告前一个服务器的状态。在'for'命令之前添加'set STATUS = NONE'或类似的参数来设置默认值。 –

+0

@HarryJohnston出于这个原因,我试着将“Not Activated”服务器作为列表中的第一个服务器,这样就没有冗余。 –

+0

除非您打开一个新的命令窗口,否则该变量可能仍然是从以前的脚本运行中设置的。 –

回答

0

一些提示:

  • 如果您使用"delims=",则整个输入行只有一个令牌,一个令牌是默认值。
  • 如果每行只有一个服务器,并且服务器名称不能包含空格,则不需要定义分隔符。
  • 如果文件名不包含空格(而不是UTF)如果你调用一个子程序可以传递参数,无需在瓦尔存储,那么你不需要type文件
  • 如果您在冒号中解析slmgr.vbs输出分裂,则在许可证状态前会有空格,因此要么修剪或与这些空格进行比较。
  • 将var内容与qoutes中的字符串进行比较时,您还必须引用var内容。
  • 当设置一个var不使用Set %varname%=content时,这将创建一个var作为var的内容作为名称的新var。
  • 调试时使用开放cmd窗口和temporily回波设置

具有不同语言环境我不能测试文本" Licensed"

@echo off 
Set "RESULTFILE=C:\users\v7t7adm\desktop\result.txt" 
Set "SERVERLIST=C:\users\v7t7adm\desktop\server.txt" 
Set "SlMgr=cscript c:\Windows\System32\slmgr.vbs" 

:START-SCRIPT 
@for /F %%a in (%SERVERLIST%) do Call :SCRIPT %%a 
Goto :eof 

:SCRIPT 
Set "STATUS=" 
@for /F "tokens=1-2 delims=:" %%a in (
    '%SlMgr% %1 /dli ^|findstr /I /C:"License Status:"' 
) do Set STATUS=%%b 

IF not defined STATUS Echo couldn't evaluate License status for %1 &Goto :Eof 

IF /I "%STATUS%" neq " Licensed" set "STATUS=Not Licensed" 

echo %1 - [%STATUS%] 
echo %1 - [%STATUS%] >> %RESULTFILE% 

Goto :EOF 
+0

一切工作正常,但是当我在整个环境中运行此脚本时,它仍然会给出错误的结果。 –

+0

是否有非英文语言环境? Slmgr.vbs将返回本地化的字符串。 – LotPings

+0

请详细说明一下? –