Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Не производится выгрузка значений из WMIC с счетчиком. (http://forum.oszone.net/showthread.php?t=311314)

8ash8 08-02-2016 16:54 2603758

Не производится выгрузка значений из WMIC с счетчиком.
 
Добрый день друзья, при выгрузке обновлений через WMIC столкнулся с проблемой: если прописать то список обновлений нормально выгружается. но по чему то между ними проставляются пробелы.

Скрытый текст

For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC QFE GET HotFixID /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do echo UPDATE; %%B %TW2%


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

Скрытый текст
Set TW2=^>^>2_%computername%.CSV
For /F "Tokens=1,3* Delims=,:" %%A In ('WMIC QFE GET HotFixID /FORMAT:CSV^|FindStr .^|More +1^|FindStr /n .') Do ((Set UPDATE=%%B) & (Set /a K+=1) & (echo %K%; %UPDATE% %TW2%))

Foreigner 08-02-2016 17:43 2603772

Код:

@echo off
setlocal enabledelayedexpansion

for /f "tokens=2 delims==" %%i in ('wmic qfe get hotfixid /value') do (

        if not "%%i"=="" (

                set /a cnt+=1
                1>>"%computername%.csv" echo !cnt!;%%i

        )

)


Iska 09-02-2016 07:07 2603942

Foreigner, тут тоже надо по-хорошему вывод «wmic.exe» через двойное раскрытие делать, поскольку получается опять CrCrLf:
Скрытый текст


Надо полагать, это:
Цитата:

Цитата 8ash8
и как убрать пустую строку в CSV файле между выгруженными значениями? »

именно о сём, поскольку CrCrLf приводит к:
Скрытый текст

8ash8 09-02-2016 09:23 2603974

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

Iska, можете объяснить откуда берутся CrCrLf при выгрузке и как от них можно избавиться?

Foreigner 09-02-2016 11:22 2604008

Цитата:

Цитата 8ash8
почему выгрузка не производилась? »

Вы явно перемудрили с findstr и more и с выводом в формате csv (вы берете 1 и 3* токены, а их только 2 (имя компьютера и сам хотфикс))

alpap 09-02-2016 19:52 2604252

Так чтобы не было пустых строк и пробелов:
Код:

@echo off
for /f "skip=2 delims=" %%m in ('wmic path Win32_OperatingSystemQFE get /format:csv') do (
 for /f "tokens=4 delims==," %%a in ("%%~m") do (
  if not "%%~a"=="" set /a cnt+=1
  1>>"%computername%.csv" cmd /v /c "echo !cnt!;%%~a"
))
exit

.

Iska 10-02-2016 07:10 2604368

Цитата:

Цитата 8ash8
Iska, можете объяснить откуда берутся CrCrLf при выгрузке »

Они берутся из особенностей разбора юникодного вывода утилиты «wmic.exe».

Цитата:

Цитата 8ash8
и как от них можно избавиться? »

Двойным разбором по «for /f». Опробуйте, например, код коллеги alpap.

Foreigner 10-02-2016 09:02 2604383

Цитата:

Цитата Iska
тут тоже надо по-хорошему вывод «wmic.exe» через двойное раскрытие делать, поскольку получается опять CrCrLf »

Это вы где такую картинку увидели? У меня нет никаких CrCrLf.
Код:

> (gc .\$env:computername.csv)[0]
1;KB3116900
> (gc .\$env:computername.csv)[0].length
11


Iska 10-02-2016 09:41 2604400

Цитата:

Цитата Foreigner
Это вы где такую картинку увидели? »

Открыл результирующий файл в Far Manager'е (F3, затем F4).

Цитата:

Цитата Foreigner
У меня нет никаких CrCrLf. »

А выложите Ваш результирующий файл. Не факт, что «Get-Content» не вносит свои коррективы.

Foreigner 10-02-2016 10:28 2604415

Вложений: 1
Цитата:

Цитата Iska
выложите Ваш результирующий файл »

Хотя судя по размеру, там явно что-то не так.

Iska 10-02-2016 10:57 2604426

Угу. У Вас там ровно так же каждая строка оканчивается — \0x0D,\0x0D,\0x0A. А «Get-Content», значит, «умеет» такие несуразицы воспринимать корректно.

8ash8 10-02-2016 11:50 2604459

Всем большое спасибо за помощь и разъяснения!

8ash8 10-02-2016 17:35 2604616

Добрый день, друзья прикрутил код alpap к выгрузке винтов, все отлично работает, но как только попытался вынести код в отдельную функцию см (вариант 2) результат не выводится подскажите где косяк?

Вариант 1
Set TW1=^>^>%computername%.CSV
for /f "skip=2 delims=" %%m In ('WMIC DISKDRIVE Where InterfaceType^=^'IDE^' GET Model /format:csv') Do (
for /f "tokens=2 delims==," %%a in ("%%~m") do (
if not "%%~a"=="" set /a cnt+=1
%TW1% cmd /v /c "echo HDD!cnt!;%%~a"
))
exit


Вариант 2

Set TW1=^>^>%computername%.CSV
for /f "skip=2 delims=" %%m In ('WMIC DISKDRIVE Where InterfaceType^=^'IDE^' GET Model /format:csv') Do (
Call :123 "%%~m"
)
Exit
:123
for /f "tokens=2 delims==," %%a in ("%%~m") do (
if not "%%~a"=="" set /a cnt+=1
%TW1% cmd /v /c "echo HDD!cnt!;%%~a"
)
Exit /B

Iska 10-02-2016 18:05 2604635

Как минимум, здесь:
Код:

for /f "tokens=2 delims==," %%a in ("%~1") do (


Время: 12:00.

Время: 12:00.
© OSzone.net 2001-