Вы можете попробовать следующий фрагмент кода:
@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
петель или блоков коды между ()
.
Для этого же класса вы можете получить несколько значений, например: 'wmic/node: %% a/user:% user%/password:% password% computersystem get Name, Model/format: table' (столбцы отсортированы в алфавитном порядке по свойству) – aschipfl
да, но когда я помещал его в файл csv, мне нужно его разделять запятой, чтобы я мог импортировать его в другую программу для организации – TmCookieMonster
В чистых командных сценариях это не тривиально, так как '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