研发部门已要求我们在公司的所有系统中部署新的Outlook插件...但是,有一个陷阱。如果您有其他任何我们公司过时的插件,则会破坏它们。.因此,我们需要确定端点是否安装了该插件以及它的版本。如果已安装且版本低于“ X”,那么我们需要对其进行更新。另一个问题是,并非每个人都使用这些插件,因此我们不能仅将其推给所有人并每天使用。
这样,我们发现了一个查询,该查询将调用WMI并吐出输出,然后将其写入文件。跑步
"wmic product where "Vendor like '%Microsoft%'" get Name, Version > C:\temp\test.txt"
给我们输出:
名称版本 Microsoft Outlook 1.1.9.0的第一个插件 Microsoft Outlook 2.0.2.0的第二个插件 Microsoft Outlook 1.2.5.0的第三个插件 等等。
我们要做的是解析每个版本,并将版本写入文件中,这样我们就可以查看是否需要部署新插件。
前任:
First.txt包含1.1.9.0 Second.txt包含2.0.2.0 等等。
例如,如果Test.txt中没有“ First”,则根本不制作文件。我们几乎必须使用批处理文件来执行此操作,但是应该也可以使用PowerShell来执行此操作(尽管由于我们的部署系统功能不十分强大,因此需要进行一些调整)。
因此,我想知道是否有人可以为我指出有关在Windows系统上执行此操作的正确方向。
注意:此答案回答了所述问题,从正则表达式匹配的角度来看可能会很有趣,但是要想从根本上获得更好的解决方案,请参见rojo对这个问题的评论。
以下Powershell管道.txt
根据请求写入单个文件,这些文件以产品命名(带有扩展名)并包含版本号:
Get-Content C:\temp\test.txt | Select-Object -Skip 1 | ForEach-Object `
{
if ($_ -match '^(.*[^ ]) +([^ ]+) *$') {
$fname = $matches[1] + '.txt'
$ver = $matches[2]
$ver > $fname
}
}
请注意,输出文件将写入当前目录。
Get-Content C:\temp\test.txt
通过管道逐行发送文件的内容。
Select-Object -Skip 1
跳过标题行。
$_ -match '^(.*[^ ]) +([^ ]+) *$'
$_
将正则表达式()与使用捕获组((...)
)捕获可通过特殊match-info变量元素访问的产品名称和版本号子字符串的正则表达式进行匹配$matches
。
$fname = $matches[1] + '.txt'
追加.txt
到第一个捕获组-产品名称-并将其存储在变量中$fname
。
$ver = $matches[2]
保存版本号-第二个捕获分组变量$ver
。
$ver > $fname
只需将版本号写入输出文件即可。
>
)时,PowerShell会创建UTF-16 LE编码的文件。要使用其他编码,请使用$ver | Out-File -Encoding utf8
。如果要从cmd.exe
(批处理文件)调用整个PowerShell命令,请使用以下命令:
powershell.exe -noprofile -command "Get-Content C:\temp\test.txt | Select-Object -Skip 1 | ForEach-Object { if ($_ -match '^(.*[^ ]) +([^ ]+) *$') { $fname = $matches[1] + '.txt'; $ver = $matches[2]; $ver > $fname } }"
要将插件名称的第二个用空格分隔的标记用作文件名,请执行以下操作:
在以上两个命令中,替换为:
$fname = $matches[1] + '.txt'
和:
$fname = (-split $matches[1])[1] + '.txt'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句