Powershell сообщает о неверном значении переменной - PullRequest
0 голосов
/ 28 августа 2018

плохо знаком с stackoverflow. В течение многих лет скрывался, но теперь нуждаюсь в помощи. Я пишу простой сценарий для MSP для определения базового набора приложений и, если он не установлен, для запуска команды шоколадной установки для этого приложения. Когда я запускаю это в ISE как администратор, он сообщает true для всех значений переменных, даже если это не так. Если я запускаю только test-path и говорю ему написать-host значение, это правильно. Но когда все проходит вместе, оно всегда возвращается Истина. Может ли кто-нибудь помочь расследовать для меня?

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

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Ваш код имеет несколько проблем,

IF ($a = "True")

Вы не можете использовать = равно, вы должны использовать -eq. Кроме того, «True» - это String, содержащий 4 символа, значения boolean для True и False равны $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" first - что в моем случае возвращает $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

Который на моем ПК выводит:

7-Zip already installed
Installing Package X...
Installing Package Y...
0 голосов
/ 28 августа 2018

Я устанавливал для моей переменной значение true и не проверял значение. Изменено = на -eq для оператора if, и теперь оно работает нормально.

0 голосов
/ 28 августа 2018

Вы вводили в консоль код в точности как в вопросе? Если так, то это не правильный синтаксис. Операторы 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», проверьте, не установлены ли в вашей консоли эти переменные на true уже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...