获取所有"已激活"的列表和"未激活" Windows服务器

时间:2017-02-15 23:14:05

标签: windows batch-file

我正在尝试编写一个脚本,从服务器列表中,在执行脚本时,显示窗口所在的服务器数量"许可"或"未获得许可"。我写过这个脚本,但问题是,未激活的服务器也会输出" Licensed"。

这是脚本 -

@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 - 未获得许可

服务器y - 许可

但我得到了输出 -

服务器x - 许可

服务器y - 许可

1 个答案:

答案 0 :(得分:0)

一些提示:

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

拥有不同的区域设置我无法测试文本" 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