1

Я хотел бы запустить сценарий, где я могу получить окна Имя и версия системы всех компьютеров, работающих в компании, поместите их в текстовый файл. Затем сделайте системную переменную из моего имени окна. Я знаю, что делать, но где я сталкиваюсь с проблемой, является владельцем места. так вот мой код:OS Name Variable

:OS_NAME 
    Set OS_NAME= systeminfo | find "OS Name" 

    :OS_Ver 
    Set OS_Version= systeminfo | findstr /B /C:"OS Version" 

    systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /c:"BIOS Version" | >> G:\Directory\%Computername% 

    :OS_Arch 
    IF exist "%programfiles(x86)% (SET OS_ARCH=X64) 
    Else (SET OS_ARCH=X86) 

    :Win_7 
    systeminfo | find "Microsoft Windows 7" > nul 
     if %ERRORLEVEL% == 0 (
      goto ver_7) 


    :Ver_7 
    Set Win7= systeminfo | find "Microsoft Windows 7" 
    Echo %computername% is running %WIN7% in %OS_ARCH% Environment >> G:\Directory\Win7Comps.txt 

Поэтому в основном я хотел бы обойму места для результатов Systeminfo, которые я могу обратиться и разбор его моей команда SET, когда я делаю мой системные переменные.

Спасибо, любая помощь будет воспринята.

ответ

3

Не совсем уверен, что вы ищете, но самая большая проблема, которую я вижу, что systeminfo принимает навсегда для запуска и возвращает гораздо больше информации, чем вы ищете. Вам лучше было бы захватить wmi-запросы, используя wmic. Это в основном переписывание вашего примера скрипта, просто используя wmic, а не systeminfo. Это должно быть намного, намного быстрее.

@echo off 
setlocal 
set prefix=G:\Directory 

for /f "usebackq tokens=1,2 delims==|" %%I in (`wmic os get name^,version /format:list`) do 2>NUL set "%%I=%%J" 
for /f "tokens=2 delims==" %%I in ('wmic bios get version /format:list') do set "bios=%%I" 
for /f "tokens=2 delims==" %%I in ('wmic computersystem get model /format:list') do set "model=%%I" 

>>"%prefix%\%COMPUTERNAME%" echo OS Name: %name% 
>>"%prefix%\%COMPUTERNAME%" echo OS Version: %version% 
>>"%prefix%\%COMPUTERNAME%" echo PC Model: %model% 
>>"%prefix%\%COMPUTERNAME%" echo BIOS Version: %bios% 

if defined PROGRAMFILES(x86) (set arch=X64) else set arch=X86 

if "%name%" neq "%name:Windows 8=%" (
    set out=%prefix%\Win8Comps.txt 
) else if "%name%" neq "%name:Windows 7=%" (
    set out=%prefix%\Win7Comps.txt 
) else if "%name%" neq "%name:Windows Vista=%" (
    set out=%prefix%\WinVistaComps.txt 
) else if "%name%" neq "%name:Windows XP=%" (
    set out=%prefix%\WinXPComps.txt 
) 

>>"%out%" echo %COMPUTERNAME% is running %name% in %arch% environment 

Тип wmic /? для получения дополнительной информации, а также попробовать wmic computersystem get /? или подобное, чтобы увидеть список элементов, которые могут быть запрошены в рамках каждого класса.


wmic - швейцарский армейский нож Windows. Удовлетворительный факт: вы можете даже использовать таблицу wmic для generate a web page установленной программы на удаленной системе.

+0

Ваш скрипт потрясающий! и работает безупречно !! Не могли бы вы разбить его? или добавить комментарии? – Samster

+0

@Sami_Sheikh - Конечно, но, вероятно, не до понедельника. Если у меня появится шанс, я вложу исчерпывающие комментарии и поставлю их на пастебин или аналогичный для вас. – rojo

+0

@Sami_Sheikh - Хорошо, я сцепил [сильно прокомментированную версию] (http://pastebin.com/U8g3S6gh) этого скрипта для вас. – rojo

1

Вы даете партию слишком много кредита. Если вы запустили echo %OS_NAME%, это будет буквально эхом systeminfo | find "OS Name". Переменные в пакете всегда будут просто расширяться, они не будут обрабатываться дальше. Это также более чем вероятно попытается запустить find "OS Name" при попытке установить переменную как | не скрывается и не заключен в двойные кавычки.

Если вы хотите установить вывод команды на значение, которое вы должны захватить его в for заявлении, как это:

for /f "tokens=2 delims=:" %%a in ('systeminfo ^| find "OS Name"') do set OS_Name=%%a 

Затем удалить начальные пробелы, как это: (есть, вероятно, лучше способ сделать это)

for /f "tokens=* delims= " %%a in ("%OS_Name%") do set OS_Name=%%a 

Несколько вещей, чтобы отметить здесь. 1.) "tokens=2 delims=:" устанавливает разделитель на :, и он выбирает только вторую секцию, которая будет тянуть только ту часть, которую вы хотите. 2.) | экранирован с помощью ^, это должно быть сделано в циклах for или что-то в этом роде, после чего попытается выполнить отдельные команды. 3.) "tokens=* delims= " Токен здесь *, который является все жетонами.

Несколько других проблем, которые я нашел. :

systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /c:"BIOS Version" | >> G:\Directory\%Computername% 

0 Оценка: | знак в конце.

IF exist "%programfiles(x86)% (SET OS_ARCH=X64) 
Else (SET OS_ARCH=X86) 

две проблемы здесь, вы не закончили двойные кавычки вокруг пути, и else должен быть на той же строке, что и заканчивающихся круглые скобки, если утверждение, например:

IF exist "%programfiles(x86)% (SET OS_ARCH=X64 
) Else (SET OS_ARCH=X86) 

в противном случае он пытается обработать else, как это собственная команда

+0

У вас есть опечатка здесь: '1.)" tokens = 2 delims = "устанавливает разделитель на:' :) – Endoro

+0

ty sir, я исправился. –