【发布时间】:2018-01-18 19:02:07
【问题描述】:
问题
我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用$PSScriptRoot 而非$MyInvocation.MyCommand.Path 获取当前脚本根目录是否会出现问题。
详情
一位同事顺便告诉我,使用$PSScriptRoot 对远程功能来说不是一个好主意,因为我偶尔会发现它在运行时由于某种原因不会返回预期值,即使它以前工作过。但是,无法解释为什么会这样。
在我的研究中,我没有找到任何可以进一步解释这一点或避免此类问题的最佳实践方法的内容。我主要发现这两者基本上是可以互换的;但是,$PSScriptRoot只能在 PowerShell v3 或更高版本中使用。通过你们中的几个人的帮助,我也了解到$MyInvocation 具有情境差异,可以根据范围和模块进行更改。但我仍然没有发现这是否或为什么会成为 PowerShell Remoting 的问题。
示例 001
所以我在 Jenkins 中有一个 PowerShell 脚本,它使用$PSScriptRoot 作为查找我希望通过相对路径调用的脚本的方法。我能否依靠它来始终为所述脚本提供相同/预期的路径?
示例 002
使用由 Jenkins 启动的 PowerShell 脚本调用的 PowerShell 脚本,我是否能够期望 $PSScriptRoot 能够为我提供该脚本实际所在的路径,或者它会给我一个基于 Jenkins 的路径?
就我个人而言,我希望$PSScriptRoot 会为我提供正在运行的脚本的实际物理位置,而不是根据调用它的初始脚本而改变的相对路径。
由于有了这种理解可以帮助我节省很多时间和头痛,我希望像你这样的程序员同行可以帮助我了解如果这是真的,以及为什么会发生这样的问题。
问题
我想知道使用 $PSScriptRoot 是否会导致我在 PowerShell 远程处理中出现问题,从而使使用 $MyInvocation 成为更可行的选择?
【问题讨论】:
-
$MyInvocation.MyCommand.Path和$PSScriptRoot之间的区别在于:a) 一个包含文件名,另一个不包含,b) 一个适用于所有 PowerShell 版本,另一个仅适用于 PowerShell v3 及更高版本.期间。 -
你知道......当你试图“帮助”某人时,你不需要成为一个混蛋。作为对 PowerShell 还有些陌生的人,我问这个问题。我只是在问,因为我目前正在处理一个复杂的问题,有人告诉我使用 $PSScriptRoot 会很糟糕,因为我不会总是得到我期望它提供的路线。
-
@Brandon 再次,正如我在我现在已删除的 cmets 中所说,您需要在此处发布具体问题。 你描述的场景是什么?
-
@briantist 再次编辑了一个更具体的问题
-
@Brandon 1) 你试过看看它会返回什么吗? 2) 你认为
current script在这种情况下是什么?
标签: powershell powershell-remoting automatic-variable