2016-01-20 3 views
0

я сделал этот сценарий, который использует WMIC для получения информации с удаленного компьютераразделенные запятой Wmic команды

set /p "user=write UserName=" 
set /p "password=write Password=" 


for /f "tokens=*" %%a in (ip.txt) do ( 

    wmic /node:%%a /user:%user% /password:%password% computersystem get Name /format:table 
    wmic /node:%%a /user:%user% /password:%password% computersystem get Model /format:table 
    wmic /node:%%a /user:%user% /password:%password% computersystem get totalphysicalmemory /format:table 
    wmic /node:%%a /user:%user% /password:%password% cpu get Name /format:table 
    wmic /node:%%a /user:%user% /password:%password% path Win32_VideoController get Name /format:table 
    wmic /node:%%a /user:%user% /password:%password% os get Caption /format:table 
    wmic /node:%%a /user:%user% /password:%password% csproduct get identifyingnumber /format:table 
    wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenheight /format:table 
    wmic /node:%%a /user:%user% /password:%password% desktopmonitor get screenwidth /format:table 

)>>a.csv 

но выход немного странно, что отделяет с «ввести» любую идею, как запятая отделить?

+0

Для этого же класса вы можете получить несколько значений, например: 'wmic/node: %% a/user:% user%/password:% password% computersystem get Name, Model/format: table' (столбцы отсортированы в алфавитном порядке по свойству) – aschipfl

+0

да, но когда я помещал его в файл csv, мне нужно его разделять запятой, чтобы я мог импортировать его в другую программу для организации – TmCookieMonster

+1

В чистых командных сценариях это не тривиально, так как 'wmic' производит вывод Unicode, который ведет к некоторым неприятностям; однако вы можете выполнить командную строку 'every_ 'wmic' в циклах' for/F', чтобы циклы обрабатывали вывод: 'for/F 'tokens = 1, * delims ==" %% A in (' wmic OS GET Caption/VALUE ') для/F "delims =" %% Z in ("%% B") do echo (%% Z' (есть две петли: внешняя отделяет интересующую ценность, внутренняя удаляет потенциал осиротевшие символы возврата каретки, которые оставлены внешним во время преобразования Unicode/ANSI) – aschipfl

ответ

1

Вы можете попробовать следующий фрагмент кода:

@echo off 
setlocal EnableDelayedExpansion 
set /P "user=write UserName=" 
set /P "password=write Password=" 
> "a.csv" (
    for /F "usebackq tokens=*" %%a in ("ip.txt") do (
     set "lineString=" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem    get Name    /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem    get Model    /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% computersystem    get totalphysicalmemory /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% cpu      get Name    /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% path Win32_VideoController get Name    /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% os       get Caption    /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% csproduct     get identifyingnumber /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% desktopmonitor    get screenheight  /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     for /F "tokens=1,* delims==" %%A in ('wmic /node:%%a /user:%user% /password:%password% desktopmonitor    get screenwidth   /value') do for /F "delims=" %%Z in ("%%B") do set "lineString=!lineString!,%%Z" 
     if defined lineString echo(!lineString:~1! 
    ) 
) 
endlocal 
exit /B 

wmic выход хранится в , -разделенное строку в переменной lineString. Для захвата вывода команды идеально подходит петля for /F. Однако команда wmic создает выход Unicode, поэтому для выполнения правильного преобразования Unicode/ANSI необходимы две вложенные петли for /F; в одном цикле оставались бы осиротевшие конечные символы возврата каретки в строках.

Формат выхода wmic был изменен с /format:table к /value, чтобы получить выходной сигнал, как это: Caption=Microsoft Windows 7 Enterprise, так что цикл for /F может принимать = в качестве разделителя и получить желаемое значение.

Помимо всего этого, я также изменил следующее:

В коде, вы перенаправили вывод каждой итерации цикла отдельно. Чтобы избежать этого, () были помещены вокруг цикла (внешний-самый) for /F, поэтому все данные перенаправляются один раз в a.csv. Следовательно, оператор перенаправления был изменен с append-type >> на (over-) тип записи >.

Delayed expansion был включен, которая требуется при модификации и чтения переменного (lineString) в пределах for петель или блоков коды между ().

+0

Я только что узнал, что я пропустил '=' в параметрах 'demils =' для циклов 'for/F', и я вставил '@echo off' в начале, чтобы избежать выхода каких-либо команд в файл' a.txt', см. мой [edit] (http://stackoverflow.com/revisions/34909662/2) ... – aschipfl

+0

удивительный, спасибо!, я думаю, что понимаю, но почему '/ format: table' изменился на'/value'? – TmCookieMonster

+0

Скажем, у нас есть 'wmic OS get Caption/format: table', вывод будет строкой' Caption', затем «Microsoft Windows 7 Enterprise», поэтому g et, значение, окружение 'for/F' должно повторяться дважды, или мне нужно будет жестко закодировать определенную строку (число); с '/ value' существует только одна строка; все это верно только в том случае, если запрашивается одно значение 'wmic'; однако, если вы предпочитаете использовать '/ format: table', вы можете это сделать, если вы соответствующим образом адаптируете опции' for/F': '" skip = 1 delims = "' вместо '" tokens = 1, * delims == "' – aschipfl

Смежные вопросы