2015-06-09 2 views
0
$i=0;$pnp = pnputil -e; 
$matched = [regex]::matches($pnp, ".......................................Lexmark International"); 
$split = $matched -split (".........inf"); 
$replace = $split -replace " Driver package provider : Lexmark International",""; 
$replace1 = $replace -replace " ","`n";write-output $replace1; 
foreach ($i in $replace1){;$pnpdel = pnputil -f -d $i;$pnpdel;}; 
Reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows x64\Drivers\Version-3\Lexmark Universal v2 XL" /f; 
net stop spooler;net start spooler;start \\officechicprt5\111W-22E-CPRN-01 

Как вы можете видеть, надеюсь, мой скрипт пытается тянуть OEm * .inf значения из -e команды pnpitil. Я пытаюсь получить каждый файл oem ##. Inf, чтобы быть его собственной переменной в цикле For. Мой скрипт немного беспорядок со всеми заменами и разбиениями, но эта часть, похоже, получает часть команды, которая мне нужна. У меня возникают проблемы с данными в $ i. Похоже, скрипт иногда работает, а иногда и нет. Я хочу pnputil -d oem99.inf для каждого oem #, который он находит в перечислении pnputil. Что я делаю неправильно в моем цикле For? Должен быть лучший способ ... Я все еще довольно новичок в этом, как вы можете сказать.Powershell Для Loop, Заменить, Сплит, Regex Матчи

Еще раз спасибо. Brent

+0

«Похоже, скрипт иногда работает, а иногда и нет». что происходит, когда он появляется, чтобы не работать? –

+0

Команда pnputil вернет ошибку, в основном «не может удалить ее». –

ответ

2

Используя власть в PowerShell можно превратить вывод pnputil в массив объектов, которые делают его гораздо легче анализировать данные, которые вы ищете (так как это кажется, что Вы ищете что-то конкретное).

Каждая запись представляет собой группу переменных с пустой линией между ними. Используя это, вы можете превратить эти данные в пользовательские объекты.

$rawdata = pnputil -e | Select-Object -Skip 1 
$rawdata = $rawdata -join "`r`n" -split "`r`n`r`n" 
$entries = $rawdata | ForEach-Object{ 
    $props = $_ -replace ":","=" | ConvertFrom-StringData 
    new-object -TypeName PSCustomObject -Property $props 
} 

$rawdata первоначально содержит текст из pnputil -e. Мы используем Select-Object -Skip 1 для удаления «Утилиты Microsoft PnP Utility». Поскольку $rawdata - это массив, для этого подхода требуется, что это одна длинная строка, поэтому -join "`r`n". Сразу же после того, как мы разделим его на отдельные элементы массива каждой группы свойств с -split "`r`n`r`n", которая разбивается на пустую строку, которую вы видите в CMD-выходе.

Волшебство исходит от ConvertFrom-StringData, которые создают хеш-таблицу из пары ключевых значений в укусах. В потребности =, чтобы работать, поэтому мы конвертируем двоеточия как таковые. С каждой созданной хэш-таблицей мы преобразуем ее в объект и сохраняем ее в переменной $entries. $entries всегда будет массивом, так как безопасно ожидать более одной записи.

Sample запись после преобразования:

Class     : Printers 
Driver date and version : 12/03/2014 1.5.0.0 
Signer name    : Microsoft Windows Hardware Compatibility Publisher 
Published name   : oem27.inf 
Driver package provider : Ricoh 

Теперь мы можем использовать PowerShell, чтобы отфильтровать точно то, что вы ищете!

$entries | Where-Object{$_."Driver package provider" -match "Ricoh"} | Select-Object -ExpandProperty "Published name" 

Обратите внимание, что это также может возвращать массив, но для меня была только одна запись. Выходной сигнал для этого был oem27.inf

Затем, используя информацию, которую вы действительно ищете, вы можете запускать свои другие команды.

+0

Ничего себе, это отлично работает! Хотел бы я проголосовать за это. огромное спасибо –

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