如何使用 Powershell 在远程机器上执行安装程序可执行文件?
How to execute an installer executable on a remote machine with Powershell?
我正在尝试在我们的 Windows 服务器上自动升级 Spotfire BI 系统。
这些说明显示了一个可用于静默安装的命令,其中说明了可执行文件的位置,后跟所有必需的 options/parameters,如本例所示:
install.exe INSTALLDIR="<node manager installation dir>" NODEMANAGER_REGISTRATION_PORT=9080 NODEMANAGER_COMMUNICATION_PORT=9443 SERVER_NAME=SpotfireServerName SERVER_BACKEND_REGISTRATION_PORT=9080 SERVER_BACKEND_COMMUNICATION_PORT=9443 NODEMANAGER_HOST_NAMES=NodeManagerHostNames NODEMANAGER_HOST=NodeManagerHost -silent -log "C:\Users\user\Log file.log"
这确实有效,只要它前面有调用运算符 (&),它 运行在 PowerShell 中就很好。但是,运行在远程服务器上运行时我无法让它工作:
function nodeManagerUpgrade {
Param([String]$ServiceName1,
[String]$InstallDirectory,
[String]$HostNames1
)
Stop-Service $ServiceName1
# this is the line that fails
& "X:/downloads/spotfire/install.exe" INSTALLDIR="$InstallDirectory" NODEMANAGER_REGISTRATION_PORT=17080 NODEMANAGER_COMMUNICATION_PORT=17443 SERVER_NAME=localhost SERVER_BACKEND_REGISTRATION_PORT=19080 SERVER_BACKEND_COMMUNICATION_PORT1=9443 NODEMANAGER_HOST_NAMES=$HostNames1 -silent -log "install.log"
}
Invoke-Command -ComputerName $NodeIP -ScriptBlock ${function:nodeManagerUpgrade} -argumentlist ($ServiceName,$InstallDirectory,$HostNames) -credential $credentials
我可以 运行 直接在远程服务器上的函数中包含的代码,它可以正常工作。但是,当我尝试在函数内通过 WinRM/Invoke-Command
从中央服务器 运行 它时,它没有给我这个错误:
The term 'X:/downloads/spotfire/install.exe' is not recognized as the name of a cmdlet
是否可以在远程服务器上使用 PowerShell 运行 可执行文件?
您的可执行文件路径基于盘符、X:
.
但是,在远程会话中,映射 驱动器(连接到网络共享的驱动器)默认不可用,因此您有两个选择:
在调用可执行文件(例如,$null = New-PSDrive X FileSystem \foo\bar
)之前使用 New-PSDrive
建立(临时)驱动器映射
更简单地说,使用目标可执行文件的完整 UNC 路径(例如
& \foo\bar\downloads\spotfire\install.exe ...
)
如果目标可执行文件实际上无法从远程会话访问,您必须先将其复制到那里,这需要明确建立远程会话并使用
Copy-Item
-ToSession
- see the docs例如。
我正在尝试在我们的 Windows 服务器上自动升级 Spotfire BI 系统。
这些说明显示了一个可用于静默安装的命令,其中说明了可执行文件的位置,后跟所有必需的 options/parameters,如本例所示:
install.exe INSTALLDIR="<node manager installation dir>" NODEMANAGER_REGISTRATION_PORT=9080 NODEMANAGER_COMMUNICATION_PORT=9443 SERVER_NAME=SpotfireServerName SERVER_BACKEND_REGISTRATION_PORT=9080 SERVER_BACKEND_COMMUNICATION_PORT=9443 NODEMANAGER_HOST_NAMES=NodeManagerHostNames NODEMANAGER_HOST=NodeManagerHost -silent -log "C:\Users\user\Log file.log"
这确实有效,只要它前面有调用运算符 (&),它 运行在 PowerShell 中就很好。但是,运行在远程服务器上运行时我无法让它工作:
function nodeManagerUpgrade {
Param([String]$ServiceName1,
[String]$InstallDirectory,
[String]$HostNames1
)
Stop-Service $ServiceName1
# this is the line that fails
& "X:/downloads/spotfire/install.exe" INSTALLDIR="$InstallDirectory" NODEMANAGER_REGISTRATION_PORT=17080 NODEMANAGER_COMMUNICATION_PORT=17443 SERVER_NAME=localhost SERVER_BACKEND_REGISTRATION_PORT=19080 SERVER_BACKEND_COMMUNICATION_PORT1=9443 NODEMANAGER_HOST_NAMES=$HostNames1 -silent -log "install.log"
}
Invoke-Command -ComputerName $NodeIP -ScriptBlock ${function:nodeManagerUpgrade} -argumentlist ($ServiceName,$InstallDirectory,$HostNames) -credential $credentials
我可以 运行 直接在远程服务器上的函数中包含的代码,它可以正常工作。但是,当我尝试在函数内通过 WinRM/Invoke-Command
从中央服务器 运行 它时,它没有给我这个错误:
The term 'X:/downloads/spotfire/install.exe' is not recognized as the name of a cmdlet
是否可以在远程服务器上使用 PowerShell 运行 可执行文件?
您的可执行文件路径基于盘符、X:
.
但是,在远程会话中,映射 驱动器(连接到网络共享的驱动器)默认不可用,因此您有两个选择:
在调用可执行文件(例如,
$null = New-PSDrive X FileSystem \foo\bar
)之前使用New-PSDrive
建立(临时)驱动器映射更简单地说,使用目标可执行文件的完整 UNC 路径(例如
& \foo\bar\downloads\spotfire\install.exe ...
)
如果目标可执行文件实际上无法从远程会话访问,您必须先将其复制到那里,这需要明确建立远程会话并使用 Copy-Item
-ToSession
- see the docs例如。