首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环的Powershell,替换,拆分,Regex匹配

循环的Powershell,替换,拆分,Regex匹配
EN

Stack Overflow用户
提问于 2015-06-09 12:27:05
回答 1查看 1.4K关注 0票数 0
代码语言:javascript
复制
$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命令中提取-e值。我试图让每个oem##.inf文件成为For循环中自己的变量。我的脚本有点混乱,所有的替换和拆分,但这部分似乎得到了我需要的部分命令。我对$i中的数据有问题。看起来这个脚本有时工作,有时不起作用。对于它在pnputil枚举中找到的每个-d,我想要pnputil oem99.inf。我的For循环做错了什么?一定有更好的方法..。正如你所知,我对这件事还是很陌生的。

再次感谢。布伦特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 13:17:42

利用PowerShell中的强大功能,我们可以将pnputil的输出转换为一个对象数组,这将使解析您正在寻找的数据变得更加容易(因为它似乎是在寻找特定的东西)。

每个条目都是一组变量,它们之间有一个空行。使用它,可以将这些数据转换为自定义对象。

代码语言:javascript
复制
$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实用程序“行。因为$rawdata是一个数组,所以这种方法需要一个长字符串,所以是-join "`r`n"。在我们将其分割成每个属性组的单独数组元素之后,立即使用-split "`r`n`r`n"将其拆分到您在cmd输出中看到的空行上。

它的魔力来自于ConvertFrom-StringData,它从刺痛中的键值对创建了一个哈希表。In需要=才能工作,所以我们将冒号转换成这样。对于创建的每个哈希表,我们将其转换为一个对象,并将其保存到变量$entries$entries将始终是一个数组,因为期望多个条目是安全的。

样本条目一旦转换:

代码语言:javascript
复制
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来过滤出您正在寻找的内容!

代码语言:javascript
复制
$entries | Where-Object{$_."Driver package provider" -match "Ricoh"} | Select-Object -ExpandProperty "Published name"

请注意,这也可以返回一个数组,但对我来说只有一个条目。其输出为oem27.inf

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30732037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档