我正在尝试编写一个小型PowerShell脚本,该脚本将使用远程计算机上的特定PowerShell模块来执行某些操作。此模块需要使用PowerShell版本> =才能工作。
我尝试使用Invoke-Command
在远程计算机上执行脚本,但我无法弄清楚如何使用远程目标上提供的最新PowerShell版本:
$SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$Session = New-PSSession -ComputerName "TARGETHOST" -Authentication Negotiate -SessionOption $SessionOption
Invoke-Command -Session $Session -ScriptBlock {
(Get-Host).Version
}
将导致使用版本1。经过一些修修补补后,我找到了一种方法来做我想做的事:
$SessionOption = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$Session = New-PSSession -ComputerName "TARGETHOST" -Authentication Negotiate -SessionOption $SessionOption
Invoke-Command -Session $Session -ScriptBlock{
C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe -Command {
(Get-Host).Version
}
}
但我不认为这是一个很好的解决方案,因为我在远程会话中产生了另一个PS会话。现在我想知道是否有更好的方法来完成同样的事情。
答案 0 :(得分:0)
当PowerShell创建时,最初的想法是通过脚本扩展来区分版本。
这个想法没有实现以保持向后兼容性并避免混淆,因此现在只有.ps1
个文件(而不是.ps2
,.ps3
等。)
由于保留了向后兼容性,他们不需要保留旧版本的PowerShell,因此将PowerShell v2安装到C:\Windows\System32\WindowsPowerShell\v1.0
目录中...在原始v1.0的顶部...并保持相同的目录名。
因此即使您认为从该目录运行PS v1,您实际上也在运行最新的Powershell版本。您可以通过从该位置运行powershell.exe并使用$PSVersionTable
就我而言:
PS C:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.15063.608
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.15063.608
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
答案 1 :(得分:0)
我的 Invoke-Command
脚本遇到了同样的问题,在检查 (Get-Host).Version
和 $host.version
时它会返回版本 1.0.0.0。但是 $PSVersionTable.PSVersion
成功输出了 5.1。因此,我修改了要求版本使用 $PSVersionTable.PSVersion
的脚本,现在它可以正常运行了。