2017-02-15 6 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%/дли" на сервере, который не активирован, он дает выход а -

Подключен к серверу х

(пустой)

Нужный выход -

сервер х - не лицензирован

сервер у - Лицензия

Но я получаю выход -

сервер х - Лицензионный

сервера у - Лицензия

+0

Поскольку выход пуст, то значение '% STATUS% 'не изменяется и просто сообщает о статусе предыдущего сервера. Добавьте 'set STATUS = NONE' или подобное перед командой' for', чтобы установить значение по умолчанию. –

+0

@HarryJohnston по этой причине я пробовал с сервером, который «не активирован», как первый сервер в списке, так что нет избыточности. –

+0

Если вы не открыли новое окно команд, переменная все еще может быть установлена ​​из предыдущих прогонов скрипта. –

ответ

0

Некоторые советы:

  • Если вы используете "delims=", для всей строки ввода есть только один токен, по умолчанию используется один токен.
  • Если в строке имеется только один сервер, а имя сервера не может содержать пробелов, нет необходимости определять делимы.
  • , если имя файла не содержит пробелов (и не в UTF) не нужно type этот файл
  • при вызове подпрограммы вы можете передать аргумент, не нужно хранить в Варс тогда.
  • Если вы разобьете выходное разделение slmgr.vbs на двоеточие, будет пространство (-ы) перед статусом лицензии, так что либо обрезайте, либо сравните с этими пробелами.
  • При сравнении содержимого var со строкой в ​​qoutes вам также придется указывать содержимое var.
  • При настройке var не использовать Set %varname%=content, это создает новый 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

Пожалуйста, уточните? –