【问题标题】:Powershell reporting wrong variable valuePowershell 报告错误的变量值
【发布时间】:2018-08-30 02:13:56
【问题描述】:

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"}

【问题讨论】:

  • = 是 PowerShell 的赋值运算符。使用 -eq 检查是否相等。
  • 另外,$true 是布尔真值,而不是“真”。

标签: powershell variables


【解决方案1】:

您的代码有一些问题,

IF ($a = "True")

你不能使用=等于,你必须使用-eq。此外,“True”是包含 4 个字符的 String,True 和 False 的 boolean 值为 $true$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...

【讨论】:

  • 我不是有意窃取您的答案,因为您是绝对正确的。我是一名 Web 服务器伪编码员,所以感谢您在学习 PowerShell 时没有让我失望。
  • 好答案,但请使用-not (...),而不是-not(...),因为后者建议使用method 语法,这不适用于任何PowerShell operators i>.
【解决方案2】:

您是否在控制台中输入了与问题中完全相同的代码?如果是这样,那么它的语法不正确。 if 语句需要在一个新行上,或者用; 将它们与Test-path 语句分开:

$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"}

当试图找出什么时候不工作时,适当的格式会有所帮助,尤其是在将粘贴代码复制到窗口中时。如果一切仍然报告“真”,请检查您的控制台是否已将这些变量设置为 true

【讨论】:

    【解决方案3】:

    我将变量设置为 true 并且不检查值。将 if 语句的 = 更改为 -eq ,现在运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多