想要使用PowerShell将不同的字符串分成多个部分的通用方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想要使用PowerShell将不同的字符串分成多个部分的通用方法相关的知识,希望对你有一定的参考价值。

我正在研究一种从注册表读取软件的UninstallStrings的方法。然后,我尝试执行这些字符串以卸载软件。

当我打印出包含字符串信息的变量时,它会正确打印整个字符串(带有参数),但是我无法运行这些字符串。此问题有多个部分。

某些安装字符串的格式如下

c:\file path\blah\app.exe /uninstall
"c:\file path\blah\app.exe" /uninstall
c:\file path\blah\app.exe --uninstall
'c:\file path\blah\app.exe' /uninstall

我想做的是找出能够以“通用”方式运行卸载程序的最佳方法。有没有办法有效地做到这一点?

我尝试以两种不同的方式执行字符串。

    & $uninstaller

    Start-Process -FilePath cmd.exe -ArgumentList '/c', $uninstaller -Wait 

他们似乎都不起作用。没有错误,但它们似乎没有运行,因为当我检查该应用程序时,它仍然已安装。

而且我尝试了几种分割文本的方法。


    $Uninstaller.split("/")[0]
    $Uninstaller.split("/",2)[1]
    $($Uninstaller) | Invoke-Expression
    $Uninstaller.Substring(0,$Uninstaller.lastIndexOf('.exe '))
    $Uninstaller.split('^(*?\.exe) *')

提前感谢!

答案

想通了。也许有更好的方法可以这样做,但这似乎对我有用。

CLS

$Software = "OneDrive"
$Filter = "*" + $Software + "*"
$Program = $ProgUninstall = $FileUninstaller = $FileArg = $NULL

try 

    if (Test-Path -Path "HKLM:\SOFTWARE\WOW6432Node") 
    
        $programs = Get-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction Stop
    

    $programs += Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction Stop
    $programs += Get-ItemProperty -Path "Registry::\HKEY_USERS\*\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue
 
catch 

    Write-Error $_
    break


foreach($Program in $Programs)

    $ProgDisplayName = $Program.DisplayName
    $ProgUninstall = $Program.UninstallString

    if($ProgDisplayName -like $Filter)
    
        if($ProgUninstall -like "msiexec*")
        
            $FileUninstaller = $ProgUninstall.split(" ")[0]
            $FileArg = ($($ProgUninstall).split(" ",2)[1])
        
        else
        
            if(($ProgUninstall -like '"*"*') -or ($ProgUninstall -like "'*'*"))
            
                #String has quotes, don't need to do anything

            
            else
            
                if($NULL -ne $ProgUninstall)
                
                    #String doesn't have quotes so we should add them
                    $ProgUninstall = '"' + ($ProgUninstall.Replace('.exe','.exe"'))                    
                
            

            #Let's grab the uninstaller and arguments
            $FileUninstaller = $ProgUninstall.split('"')[1]
            $FileArg = $ProgUninstall.split('"')[-1]
        

        #Debug
        #$FileUninstaller
        #$FileArg

        #Run the Uninstaller
        Start-Process $FileUninstaller -ArgumentList $FileArg -wait -ErrorAction SilentlyContinue
    

以上是关于想要使用PowerShell将不同的字符串分成多个部分的通用方法的主要内容,如果未能解决你的问题,请参考以下文章

powershell 一个变量中的多个参数

当内容在单引号中时,使用 PowerShell 将 SQL 文件/字符串拆分为批处理排除拆分

在 .bat 文件中使用 PowerShell,将一个字符串替换为多个字符串

c语言怎么把一个字符数组分成多个数组?

使用powershell运行多个javascripts

如何将多个字符串参数传递给 PowerShell 脚本?