소프트웨어 응용 프로그램이 이미 설치되어 있는지 확인하는 방법을 찾고 있습니다. 나는 사람들이 소프트웨어 종속성을 위해 이를 수행한 몇 가지 방법을 보았지만 그것은 내가 필요한 것을 제대로 수행하지 못했습니다. 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를 Variable로 출력하려면 명령이 필요합니다 $MyApp
.
답변1
포맷 문제가 있어서 if else 문이 제대로 작동하지 않는 것 같습니다.
실제로 PowerShell 프로그래밍 문제가 있습니다. 변수의 내용은 실제로 아래에 인용된 텍스트이며 "Sophos Endpoint"와 동일하지 않습니다.
Name ---- Sophos Endpoint
다음 설명은 항등 연산자에 적용됩니다. 기본적으로 입력 값이 서로 동일하지 않기 때문에 스크립트가 예상한 대로 정확하게 수행되었습니다.
항등 연산자(-eq, -ne)는 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 }
제품이 어떻게 호출되는지 확실하지 않은 경우 이 기능은 원격 컴퓨터 및 와일드카드 검색을 처리할 수도 있습니다. 반환받고 싶은 속성을 지정할 수도 있습니다.
함수:
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>