鉴于"C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC_redist.x86.exe" /uninstall
的uninstallString,我可以使用([Regex]::Match($uninstallString, '^\".*\"').Value)
成功地提取引用的文本。但是,如果我测试一下字符串是否具有必需的/ uninstall位,则尝试提取带引号的位,像这样...
if ([Regex]::Match($uninstallString, '^\".*\" +/uninstall').Succes) {
([Regex]::Match($uninstallString, '^\".*\"').Value)
}
它不是返回完整字符串,而是仅返回"C:\ProgramData\Package
。现在,我的理解是。除了换行符以外,其他所有内容都没有,因此空格应该可以。但是,如果我在字符串中用下划线替换空格,则它可以按预期工作,因此肯定是引起问题的空格。
另外,我很困惑为什么它在If之外而不是在If之外起作用。我给人的印象是,使用[Regex] :: Match()每次使用都会创建一个单独的对象,它们不会互相影响,但是在这里看来它们是一样的。
答案 0 :(得分:0)
由于要查看是否找到带引号的字符串(路径)以及是否包含开关“ / uninstall”, 我会做这样的事情:
$uninstallString = '"C:\ProgramData\Package Cache\{56e11d69-7cc9-40a5-a4f9-8f6190c4d84d}\VC_redist.x86.exe"'
if ($uninstallString -match '^(?<path>".*")(?:\s+(?<switch>/uninstall))?') {
$uninstallPath = $matches['path'] # at least the path (quoted string) is found
$uninstallSwitch = $matches['switch'] # if '/uninstall' switch is not present, this will result in $null
}