$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
正如您所希望的那样,我的脚本会尝试从pnpitil -e命令中提取oem * .inf值。我试图让每个oem ##。inf文件成为它在For循环中的自己的变量。我的脚本对于所有的替换和拆分有点混乱,但是那部分似乎得到了我需要的命令的一部分。我在$ i中遇到数据问题。看起来脚本有时会起作用,有时候不起作用。我希望pnputil -d oem99.inf用于它在pnputil枚举中找到的每个oem#。我的For循环中我做错了什么?必须有一个更好的方法......我可以说,我还是很新的。
再次感谢。 布伦特
答案 0 :(得分: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
将始终是一个数组,因为期望多个条目是安全的。
转换后的样品条目:
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
然后使用您实际查找的信息,您可以运行其他命令。