Powershell:从文本文件中查找特定的字符串/行,并从中删除不必要的部分/删除之前的所有内容

时间:2013-10-08 10:51:30

标签: powershell

我想制作Powershell脚本,该脚本从该行获取特定字符串。此字符串可能位于不同的行上。所以文本文件看起来像这样 - 第一个文件 -

[Bootstrap]
buildid=400m3(Build:9702)
ProductBuildid=9702
ProductCode={55E61709-D7D4-43C0-B45D-BFAF5C09A02D}
UpgradeCode={7C35B9AB-2CE3-4C18-BE7C-5B97EA089EB3}

第二档 -

[Bootstrap]
ProductCode={2BB8FBB4-CFF9-434E-AA0A-40F5379C1602}

我需要在ProductCode =

之后获取MSI代码
$openofficeSetup = "C:\Program Files (x86)\openoffice*\program\setup.ini"
if (Test-Path $openofficeSetup)
{
$openofficeMSI = Select-String "ProductCode=*" $openofficeSetup
$openofficeMSI = $openofficeMSI -Replace "*ProductCode=", ""
msiexec.exe /x $openofficeMSI /qn

第5行使用-Replace是错误的。我不知道如何删除所有内容。

PS N:\> echo $openofficeMSI
C:\Program Files (x86)\OpenOffice 4\program\setup.ini:4:ProductCode={55E61709-D7D4-43C0-B45D-BFAF5C09A02D}

如何摆脱除MSI代码之外的所有事情?

Offtopic:其他方式将在注册表中搜索MSI代码 HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\安装\产品\ 但使用setup.ini看起来更容易。

1 个答案:

答案 0 :(得分:1)

我会使用[regex] :: Match而不是select-string:

$openofficeSetup = Resolve-Path "C:\Program Files (x86)\openoffice*\program\setup.ini" 
if (Test-Path $openofficeSetup){
  $txt=[IO.File]::ReadAllText($openofficeSetup )
  $openofficeMSI = [regex]::Match($txt,'ProductCode=(.*)').Groups[1].Value
  msiexec.exe /x $openofficeMSI /qn
}