ソフトウェア アプリケーションが既にインストールされているかどうかを確認する方法を探しています。ソフトウェアの依存関係でこれを行う方法をいくつか見ましたが、必要なことは実行されません。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>