【问题标题】:Powershell $PSScriptRoot empty when using Invoke-Command使用 Invoke-Command 时 Powershell $PSScriptRoot 为空
【发布时间】:2021-02-24 13:19:24
【问题描述】:

使用 Invoke-Command 在远程计算机上运行 .ps1 时,远程计算机上的 $PSScriptRoot 为空。

这正常吗?使用 Invoke-Command 时如何找到 .ps1 路径?

此外,其他方法,例如通过 $MyInvocation 也是空的。

【问题讨论】:

  • 我的理解是$PSScriptRoot脚本启动时填写 ...而Invoke-Command在运行时会创建一个新的作用域。这就是您需要使用$Using: 范围修饰符的原因。 ///// 所以...你有没有尝试像传递任何其他变量一样传递 $Var ? [咧嘴]

标签: powershell


【解决方案1】:

这正常吗?使用 Invoke-Command 时如何找到 .ps1 路径?

当您拨打
Invoke-Command -ComputerName $someComputer -FilePath c:\path\to\some\script.ps1

时,远程计算机上没有涉及脚本文件

PowerShell在这种情况下所做的是将调用者本地脚本文件的内容(已解析的源代码)[1]发送到远程机器并执行它在那里。

因此,$PSScriptRoot(脚本文件所在的目录)不适用并返回空字符串
这同样适用于其他与脚本文件相关的自动变量,例如$PSCommandPath$MyInvocation.MyCommand.Name(参见about_Automatic_Variables)。

换种说法:当脚本文件的代码远程执行时,它不知道调用方来自文件的任何信息。

因此,您唯一可用的信息是$PWD,即当前(工作)位置(目录)。


[1] 来自docs:“当你使用这个[-FilePath] 参数时,PowerShell 将指定脚本文件的内容转换为script block,将脚本块传输到远程计算机,并在远程计算机上运行它。”

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多