【问题标题】:PowerShell Code if statement failurePowerShell 代码 if 语句失败
【发布时间】:2026-02-20 13:00:01
【问题描述】:

我遇到了一个有趣的情况,即安装了代理并与服务器进行通信。此代理现已停产,并且未续订与供应商的支持。我们的许多代理不再与服务器进行通信,因为它一直在回调我们的服务器已停用的 DMZ 网络。代理有密码防篡改,老管理员不知道密码。

我发现我们可以做的是在这些服务器上,再次安装代理,然后我们内部网络上的设备将密码更改为任何密码,就我而言,我做了空白。

更糟糕的是,代理安装在Program FilesProgram Files (x86) 中,在某些情况下,它会在同一台服务器上安装两次。

这就是我正在尝试开发的脚本的背景。我的想法是从设备下载代理,检测架构并运行安装,然后运行卸载并为每个Program Files 和/或Program Files(x86) 循环它。我让它工作正常,但它没有从 x86 目录中删除应用程序。另外,我希望能获得一些格式提示。

if ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -eq "64-bit") {
    # Download Application
    $source = "http://heartrate0001/x64/HeartRate.exe"
    $filename = [System.IO.Path]::GetFileName($source)
    $destination = "$ENV:USERPROFILE\Desktop\$filename"
    $webclient = New-Object System.Net.WebClient
    $webclient.DownloadFile($source,$destination)
    $patha = "C:\Program Files\ICU\HeartRate.exe"
    $pathb ="C:\Program Files (x86)\ICU\HeartRate.exe"
    $Folder1Path = 'C:\Program Files\ICU\HeartRate.exe'
    $Folder2Path = 'C:\Program Files (x86)\ICU\HeartRate.exe'
}

# Install Application
$process = Start-Process $destination -PassThru -Wait
$process.ExitCode

Write-Host $process.Exitcode

# Uninstall
if ((Test-Path -Path $Folder1Path) -eq "true") {
    {
        $Folder1Path = "C:\Program Files\ICU\HeartRate.exe"
        $arg1 = "-uninstall"
        & $Folder1Path $Arg1
    }
}

if ((Test-Path -Path $Folder2Path) -eq "true") {
    {
        $Folder2Path = "C:\Program Files\ICU\HeartRate.exe"
        $arg1 = "-uninstall"
        & $Folder2Path $Arg1
    }
} elseif ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -eq "32-bit") {
    # Download Application
    $source = "http://heartrate0001/HeartRate.exe"
    $destination = "$ENV:USERPROFILE\Desktop\$filename"
    $webclient = New-Object System.Net.WebClient
    $webclient.DownloadFile($source,$destination)

    # Install Application
    $process = Start-Process $destination -PassThru -Wait
    $process.ExitCode

    Write-Host $process.Exitcode

    # Uninstall
    $app = "C:\Program Files\ICU\HeartRate.exe"
    $arg1 = "-uninstall"
    & $app $Arg1
}

【问题讨论】:

  • 您的卸载块有两组花括号,我怀疑这会使内容成为脚本块,因此里面的代码没有执行。
  • 我建议使用环境变量 > "$env:ProgramFiles""${env:ProgramFiles(x86)}"
  • 你为什么安装只是为了再次卸载应用程序?
  • 我知道这很令人困惑,但是我们有一个系统代理,无论设备在哪个网络上都可以进行通信,因为它在每个网络上都有一个接口。无论出于何种原因,代理卡在我们的开发界面上并且不会与我们的生产通信。我们需要它进行通信以获取要卸载的新密码,因为旧管理员不知道他输入的密码是什么。它的愚蠢..

标签: powershell if-statement installation uninstallation


【解决方案1】:

您的 if 语句中有一个脚本块。但是,您永远不会调用该脚本块。

变化:

if ((Test-Path -Path $Folder2Path) -eq "true") {
    {
        $Folder2Path = "C:\Program Files\ICU\HeartRate.exe"
        $arg1 = "-uninstall"
        & $Folder2Path $Arg1
    }
}

到:

if ((Test-Path -Path $Folder2Path) -eq "true") {
    $Folder2Path = "C:\Program Files\ICU\HeartRate.exe"
    $arg1 = "-uninstall"
    & $Folder2Path $Arg1
}

【讨论】:

  • 感谢您快速回复。仅出于我自己的理解,如果我不更改该脚本块,我将如何调用它?
  • 使用 & 符号 & @adam 但它是多余的,看起来更像是一个错字。
【解决方案2】:

此答案纯粹是针对 OP 要求的格式示例。你的大部分工作都是多余的:

If ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -eq '64-bit')
{
    $Source = 'http://heartrate0001/x64/HeartRate.exe'
    $Destination = "$env:UserProfile\Desktop\$([IO.Path]::GetFileName($Source))"
    # PSv3+
    Invoke-WebRequest -Uri $Source -OutFile $Destination
    $x64 = "$env:ProgramFiles\ICU\HeartRate.exe"
    $x86 = "${env:ProgramFiles(x86)}\ICU\HeartRate.exe"

    (Start-Process $Destination -PassThru -Wait).ExitCode

    If (Test-Path $x64) { & $x64 -uninstall }
    If (Test-Path $x86) { & $x86 -uninstall }
}
Else
{
    $Source = 'http://heartrate0001/HeartRate.exe'
    $Destination = "$env:UserProfile\Desktop\$([IO.Path]::GetFileName($Source))"
    Invoke-WebRequest -Uri $Source -OutFile $Destination
    $x86 = "$env:ProgramFiles\ICU\HeartRate.exe"

    (Start-Process $Destination -PassThru -Wait).ExitCode

    If (Test-Path $x86) { & $x86 -uninstall }
}

【讨论】:

  • 感谢您的帮助。我知道你是如何将一切结合起来的。再次感谢。