すでにインストールされているソフトウェアの判別

すでにインストールされているソフトウェアの判別

ソフトウェア アプリケーションが既にインストールされているかどうかを確認する方法を探しています。ソフトウェアの依存関係でこれを行う方法をいくつか見ましたが、必要なことは実行されません。Powershell で使用していますGet-WmiObject。これまでのコードは次のとおりです。

#Check for Sophos
$MyApp = Get-WmiObject -Class Win32_Product | sort-object Name | select Name | where { $_.Name -eq "Sophos Endpoint"}

#Logic To Install or Skip
if ($MyApp -eq "Sophos Endpoint"){
    Write-Output "Sophos Endpoint is already installed on this computer."
}
else{
    Write-Output "Sophos Endpoint will be installed quietly in the background"

    #Install Sophos
    SophosSetup.exe --products=antivirus,intercept --quiet
}

フォーマットの問題があり、それが if else ステートメントが正しく動作しない原因であると思われます。

編集: Sophos が存在する場合、if ステートメントは else をスキップします。問題は、Get-WmiObject出力を変数にフォーマットする方法にあると思います。現在は次のように出力されます:

Name           
----           
Sophos Endpoint

すると、if ステートメントのロジックが失敗します。Get-WmiObject変数に Sophos Endpoint を出力するだけのコマンドが必要です$MyApp

答え1

フォーマットの問題があり、それが if else ステートメントが正しく動作しない原因であると思われます。

実際には PowerShell プログラミングの問題があります。変数の内容は実際には以下の引用符で囲まれたテキストであり、「Sophos Endpoint」と同じではありません。

Name           
----           
Sophos Endpoint

等価演算子については次のステートメントが当てはまります。 基本的に、入力値が互いに同一ではなかったため、スクリプトは想定どおりに動作していました。

等価演算子 (-eq、-ne) は、入力値の 1 つ以上が指定されたパターンと同一である場合に TRUE または一致の値を返します。パターン全体が値全体に一致する必要があります。

ソース:等価演算子

次のスクリプトは、正規表現に一致するものが見つかった場合に、変数の値とデバッグ メッセージを出力します。それ以外の場合は、デバッグ メッセージのみが出力されます。

#Check for Sophos
$MyApp = Get-WmiObject -Class Win32_Product | sort-object Name | select Name | where { $_.Name -match "WinZip 24.0"}

if ($MyApp -match "WinZip 24.0")
{
    Write-Output $MyApp.Name
    Write-Output "WinZip is already installed on this computer."
}
else
{
    Write-Output "WinZip is already installed on this computer."
}

ここに画像の説明を入力してください

答え2

Get-Object文字列ではなくオブジェクトを返します。

必要な文字列は、.Nameの一部となる属性です$MyApp( の出力から割り当てたためGet-Object)。

これは動作するはずです:

if ($MyApp.Name -eq "Sophos Endpoint"){`

答え3

もう一つの方法は、レジストリから製品情報を読み取ることです。

そのために次の関数を使用します(下記参照)

そうすると、次のように簡単に実行できます。

$isInstalled = Get-AppVersion "Sophos Endpoint"
if(!$isInstalled) { .\SophosSetup.exe --products=antivirus,intercept --quiet }

この関数は、製品の呼び出し方法がわからない場合に、RemoteComputers やワイルドカード検索も処理できます。また、返されるプロパティを指定することもできます。

関数:

function Get-AppVersion {

    param (
        [Parameter(Position = 0)]
        [string]$filter = '*', 
        [string[]]$properties = @("DisplayName", "DisplayVersion", "InstallDate"), 
        [string[]]$ComputerName
    )

    $regpath = @(
        "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*",
        "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
    )

    $sb = { 
        param ( $regpath, $filter, $properties )
        $regpath | ForEach-Object { Get-ItemProperty $_ } | 
            Where-Object { $_.DisplayName -ne $null -and $_.DisplayName -like $filter } | 
                Select-Object $properties 
    }

    $splat = @{}
    if ($ComputerName) { $splat['ComputerName'] = $ComputerName }

    Invoke-Command -ScriptBlock $sb -ArgumentList $regpath, $filter, $properties @splat

}

出力例をいくつか示します。

PS Z:\Powershell-Scripts> Get-AppVersion SwyxIt!

DisplayName DisplayVersion InstallDate
----------- -------------- -----------
SwyxIt!     11.32.3220.0   20181123

PS Z:\Powershell-Scripts> Get-AppVersion *swyx*

DisplayName DisplayVersion InstallDate
----------- -------------- -----------
SwyxIt!     11.32.3220.0   20181123

PS Z:\Powershell-Scripts> Get-AppVersion *swyx* -ComputerName RS

DisplayName    : SwyxIt!
DisplayVersion : 11.32.3220.0
InstallDate    : 20181129
PSComputerName : RS
RunspaceId     : ed097948-c722-4235-aa64-9b0045c5478f


PS Z:\Powershell-Scripts> Get-AppVersion dkgfmnslkf
PS Z:\Powershell-Scripts> Get-AppVersion *swyx* -properties *

AuthorizedCDFPrefix :
Comments            : SwyxIt! macht aus Ihrem PC ein komfortables und leicht zu nutzendes Telefon.
Contact             :
DisplayVersion      : 11.32.3220.0
HelpLink            :
HelpTelephone       :
InstallDate         : 20181123
InstallLocation     : C:\Program Files (x86)\SwyxIt!\
InstallSource       : Z:\Software\q-z\Swyx\SwyxWare 11.32.0.0\SwyxIt!\x64\Deutsch\
ModifyPath          : MsiExec.exe /I{1BA548A7-D32F-4D06-B9A9-451947814967}
Publisher           : Swyx Solutions GmbH
Readme              : C:\Program Files (x86)\SwyxIt!\Readme.rtf
Size                :
EstimatedSize       : 318937
UninstallString     : MsiExec.exe /I{1BA548A7-D32F-4D06-B9A9-451947814967}
URLInfoAbout        :
URLUpdateInfo       : http://www.swyx.de/support/update.html?product=SwyxIt!&version=11.32.3220.0&language=1031
VersionMajor        : 11
VersionMinor        : 32
WindowsInstaller    : 1
Version             : 186649748
Language            : 1031
DisplayName         : SwyxIt!
PSPath              : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\{1BA548A7-D32F-4D06-B9A9-451947814967}
PSParentPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName         : {1BA548A7-D32F-4D06-B9A9-451947814967}
PSDrive             : HKLM
PSProvider          : Microsoft.PowerShell.Core\Registry


PS Z:\Powershell-Scripts>

関連情報