Powershell For Loop,Replace,Split,Regex Matches

时间:2015-06-09 12:27:05

标签: regex powershell replace split

$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循环中我做错了什么?必须有一个更好的方法......我可以说,我还是很新的。

再次感谢。 布伦特

1 个答案:

答案 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

然后使用您实际查找的信息,您可以运行其他命令。