首页 > 解决方案 > Powershell 报告错误的变量值

问题描述

stackoverflow 的新手。多年来一直是潜伏者,但现在需要帮助。我正在为 MSP 编写一个简单的脚本,以检测一组基本应用程序,如果未安装,则为该应用程序运行巧克力安装命令。当我以管理员身份在 ISE 中运行它时,即使它不是真的,它也会报告所有变量值的真值。如果我只运行测试路径并告诉它写入主机它的值是正确的。但是,当全部一起运行时,它总是会返回 True。有人可以帮我调查一下吗?

#Are programs installed?

    $a = Test-Path "C:\Program Files\7-Zip" IF ($a = "True") {Write-Host "7-zip is installed"} ELSE {Write-Host "7-zip is not installed, install command sent" choco install 7zip -y}

    $b = Test-Path "C:\Program Files\Mozilla Firefox" IF ($b = "True") {Write-Host "Firefox is installed"} ELSE {Write-Host "Firefox is not installed, install command sent"}

    $c = Test-Path "C:\Program Files (x86)\Adobe\Acrobat Reader DC" IF ($c = "True") {Write-Host "Adobe Reader is installed"} ELSE {Write-Host "Adobe Reader is not installed, install command sent"}

    $d = Test-Path "C:\Program Files (x86)\Google\Chrome" IF ($d = "True") {Write-Host "Chrome is installed"} ELSE {Write-Host "Chrome is not installed, install command sent"}

标签: powershellvariables

解决方案


您的代码有一些问题,

IF ($a = "True")

您不能使用=等号,您必须使用-eq. 此外,“True”是一个String包含 4 个字符的boolean值,True 和 False的值为$trueand $false,因此您的代码变为:

    IF ($a -eq $true)

但您可以进一步简化:

    IF ($a)

以下是我将如何编写此逻辑:

if(-not (Test-Path -Path "C:\Program Files\7-Zip")){
    Write-Host "Installing 7-Zip...";
    # do stuff ... 
}else{
    Write-Host "7-Zip already installed";
}

(就像在数学中一样,您从最里面的括号开始向外工作,在这种情况下Test-Path -Path "C:\Program Files\7-Zip"首先 - 在我的情况下返回$true-not()否定括号中表达式的结果,将其( )更改为$false)。

考虑到您打算如何使用它,您可能应该将它包装在一个函数中,这样您就可以编写一次逻辑并重新使用它,而无需复制代码,例如:

#Simple function
function InstallIfNessersary([String] $installDir, [String] $chocoPackage){
    if(-not (Test-Path -Path $installDir)){
        Write-Host "Installing Package $chocoPackage...";
        #Do stuff with $chocoPackage
    }else{
        Write-Host "7-Zip already installed";
    }
}

#Call the function for each app
InstallIfNessersary -installDir "C:\Program Files\7-Zip" -chocoPackage 7zip
InstallIfNessersary -installDir "C:\Program Files\X" -chocoPackage X
InstallIfNessersary -installDir "C:\Program Files\Y" -chocoPackage Y

在我的 PC 上输出:

7-Zip already installed
Installing Package X...
Installing Package Y...

推荐阅读