我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用$PSScriptRoot
over$MyInvocation.MyCommand.Path
获取当前脚本根目录是否会出现问题。
一位同事顺便告诉我,使用$PSScriptRoot
远程功能是一个坏主意,因为我可能偶尔会发现它在运行时由于某种原因或其他原因没有返回预期值,即使它以前工作过。但是,无法解释为什么会这样。
在我的研究中,我没有发现任何可以进一步解释这一点或避免此类问题的最佳实践方法的任何内容。我主要发现这两者基本上可以互换;然而,$PSScriptRoot
可以仅在PowerShell中V3或更高版本一起使用。通过你们中的一些人的帮助,我还了解到它$MyInvocation
具有情境差异,可以根据范围和模块进行更改。但我仍然没有发现这是否或为什么会成为 PowerShell Remoting 的问题。
示例 001
所以我在 Jenkins 中有一个 PowerShell 脚本,它$PSScriptRoot
用作查找我希望通过相对路径调用的脚本的手段。我是否能够依靠它来始终为所述脚本提供相同/预期的路径?
示例 002
使用由 Jenkins 启动的 PowerShell 脚本调用的 PowerShell 脚本,我是否能够期望$PSScriptRoot
能够为我提供该脚本实际所在位置的路径,或者它会给我一个基于 Jenkins 的路径?
就我个人而言,我希望两者$PSScriptRoot
都能为我提供正在运行的脚本的实际物理位置,而不是根据调用它的初始脚本更改的相对路径。
由于有了这种理解将帮助我节省大量时间和头痛,我希望像您这样的程序员可以帮助我了解这是否属实,以及为什么会发生这样的问题。
我想知道使用$PSScriptRoot
是否会导致我在 PowerShell Remoting 中出现问题,从而使使用$MyInvocation
更可行的选项?
我正在尝试将字符串数组通过管道传输到 write-host 并显式用于$_
写入这些字符串:
'foo', 'bar', 'baz' | write-host $_
Run Code Online (Sandbox Code Playgroud)
但是,它失败了:
输入对象无法绑定到命令的任何参数,因为该命令不采用管道输入,或者输入及其属性与采用管道输入的任何参数都不匹配。
这个错误消息对我来说毫无意义,因为我完全能够写
'foo', 'bar', 'baz' | write-host
Run Code Online (Sandbox Code Playgroud)
我本以为两条管道是等效的。显然,他们不是。那么,有什么区别呢?
什么有效 -
假设我有一个scriptblock
与Select-Object
cmdlet 一起使用的。
$jobTypeSelector = `
{
if ($_.Type -eq "Foo")
{
"Bar"
}
elseif ($_.Data -match "-Action ([a-zA-Z]+)")
{
$_.Type + " [" + $Matches[1] + "]"
}
else
{
$_.Type
}
}
$projectedData = $AllJobs | Select-Object -Property State, @{Name="Type"; Expression=$jobTypeSelector}
Run Code Online (Sandbox Code Playgroud)
这工作正常,并且我得到了预期的结果。
我正在尝试做的事情 -
但是,在稍后的代码中,我想重用scriptblock
定义为$jobTypeSelector
.
例如,我期望下面的代码采用$fooJob
(注意它是单个对象)作为下面的参数传递,并用于$_
中的自动变量scriptblock
并返回相同的结果,因为它在Select-Object
cmdlet 上下文中执行时返回。
$fooType = $jobTypeSelector.Invoke($fooJob)
Run Code Online (Sandbox Code Playgroud)
什么不起作用-
它没有按我的预期工作,我得到了空值。
我已经尝试过的 -
我检查了一下,属性都设置正确,并不是因为相关属性本身为空或$null
.
我在互联网上查找,似乎很难找到有关该主题的任何相关页面,但我最终找到了一个在稍微不同的上下文中接近解释问题的页面 - …
我正在编写一些PowerShell脚本来进行一些构建自动化.我发现这里是回声$?返回true或false,具体取决于之前的语句.我刚刚发现echo是Write-Output的别名.写主机$?也有效.但我还不清楚这是多少钱?作品.有人可以说一些关于这个的话.正在搜索echo $?在网上并没有给我太多.
我试图弄清楚如何将多个字符串作为数组传递给Powershell函数。
function ArrayCount([string[]] $args) {
Write-Host $args.Count
}
ArrayCount "1" "2" "3"
ArrayCount "1","2","3"
ArrayCount @("1","2","3")
Run Code Online (Sandbox Code Playgroud)
版画
2
0
0
Run Code Online (Sandbox Code Playgroud)
如何将具有3个值的数组传递给ArrayCount
函数?为什么某些调用的计数为零?