【问题标题】:Powershell For Loop, Replace, Split, Regex MatchesPowershell For 循环、替换、拆分、正则表达式匹配
【发布时间】:2015-06-09 12:27:05
【问题描述】:
$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 枚举中找到的每个 oem#,我想要 pnputil -d oem99.inf。我在 For 循环中做错了什么?必须有更好的方法...如您所知,我对此还是很陌生。

再次感谢。 布伦特

【问题讨论】:

  • "脚本似乎有时可以工作,有时不能。"当它似乎不起作用时会发生什么?
  • pnputil 命令会返回错误,基本上是“无法删除”。

标签: regex powershell replace split


【解决方案1】:

利用 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

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

【讨论】:

  • 哇,效果很好!我希望我能投票赞成。非常感谢
  • 某些驱动程序的签名者名称(或其他值)可能带有转义字符,这会使脚本失败。您可以添加另一个-replace "\\","\\\\" 以使用转义转义字符转义转义字符:-)