Powershell For 循环、替换、拆分、正则表达式匹配
Powershell For Loop, Replace, Split, Regex Matches
$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 \officechicprt51W-22E-CPRN-01
如您所见,我的脚本试图从 pnpitil -e 命令中提取 oem*.inf 值。我试图让每个 oem##.inf 文件在 For 循环中成为它自己的变量。我的脚本有点乱,包含所有替换和拆分,但那部分似乎得到了我需要的命令部分。我对 $i 中的数据有疑问。看来该脚本有时会起作用,有时却不起作用。我想要 pnputil -d oem99.inf 它在 pnputil 枚举中找到的每个 oem#。我在 For 循环中做错了什么?必须有更好的方法...如您所知,我对此还是很陌生。
再次感谢。
布伦特
利用 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
,它根据 stings 中的键值对创建哈希表。需要 =
才能工作,因此我们将冒号转换为这样。对于创建的每个哈希表,我们将其转换为对象并将其保存到变量 $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"
请注意,这也可以 return 一个数组,但对我来说只有一个条目。此输出为 oem27.inf
然后使用您实际查找的信息,您可以 运行 您的其他命令。
$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 \officechicprt51W-22E-CPRN-01
如您所见,我的脚本试图从 pnpitil -e 命令中提取 oem*.inf 值。我试图让每个 oem##.inf 文件在 For 循环中成为它自己的变量。我的脚本有点乱,包含所有替换和拆分,但那部分似乎得到了我需要的命令部分。我对 $i 中的数据有疑问。看来该脚本有时会起作用,有时却不起作用。我想要 pnputil -d oem99.inf 它在 pnputil 枚举中找到的每个 oem#。我在 For 循环中做错了什么?必须有更好的方法...如您所知,我对此还是很陌生。
再次感谢。 布伦特
利用 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
,它根据 stings 中的键值对创建哈希表。需要 =
才能工作,因此我们将冒号转换为这样。对于创建的每个哈希表,我们将其转换为对象并将其保存到变量 $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"
请注意,这也可以 return 一个数组,但对我来说只有一个条目。此输出为 oem27.inf
然后使用您实际查找的信息,您可以 运行 您的其他命令。