下面的語法絕對適用于停止遠程計算機上的行程:
$hostname = 'PC1'
$process = 'program1*'
$Session = New-PSSession $Hostname
Invoke-Command -Session $Session -ScriptBlock {param($process) Stop-Process -ProcessName $process -Force} -ArgumentList $process
$Session | Remove-PSSession
但是,在 Jenkins 中,我引數化了主機名和行程,因此用戶輸入輸入的主機名和行程,Jenkins 創建了兩個變數 $env:hostname 和 $env:process。這不是很好,引數沒有被傳遞到停止行程:
$session = New-PSSession $env:hostname
Invoke-Command -Session $session -ScriptBlock {param($env:process) Stop-Process -ProcessName $env:process -Force} -ArgumentList $env:process
$Session | Remove-PSSession
我得到的錯誤是
Cannot bind argument to parameter 'Name' because it is null.
At C:\Users\user.name\AppData\Local\Temp\jenkins10480966582412717483.ps1:25 char:1
Invoke-Command -Session $session -ScriptBlock {param($env:process) St ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidData: (:) [Stop-Process], ParameterBindingValidationException
FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.StopProcess
Command
PSComputerName : pc1
Build step 'PowerShell' marked build as failure
Finished: FAILURE
我知道這與報價有關,請幫幫我,謝謝!
uj5u.com熱心網友回復:
除了輸入引數(即您傳遞給的內容)之外,不要更改您的Invoke-Command呼叫的任何內容:-ArgumentList
Invoke-Command `
-Session $Session `
-ScriptBlock { param($process) Stop-Process -ProcessName $process -Force } `
-ArgumentList $env:process
永遠不要使用環境變數參考來定義引數變數: 事實上,PowerShell 甚至不應該允許這樣的引數宣告,但從 7.2.x 開始允許 - 請參閱GitHub 問題 #18401。param($env:process)
在塊內宣告的引數變數的名稱與您傳遞給它param(...)的任何值-ArgumentList無關(即,它與您碰巧用于傳遞該值的變數名稱無關,以及是否該變數是常規(僅限 shell)變數或環境變數),并且在-ScriptBlock引數內部,您只能通過引數變數參考該值。
請參閱概念about_Functions幫助主題的相關部分,關于params(...)宣告引數的方法,該部分同樣適用于腳本塊( { ... })。
注意:通過's引數將值作為引數傳遞給遠程執行的腳本塊的另一種方法是使用范圍直接在腳本塊中參考呼叫者范圍內的變數值,如Dennis 的回答所示。Invoke-Command-ArgumentList$using:
在PowerShell (Core) 7 中,您可以將$using:范圍直接應用于環境變數參考,不幸的是,由于錯誤,這在Windows PowerShell中不起作用: [1]
# PS 7 alternative.
# In Windows PowerShell, stick with -ArgumentList or use Dennis'
# approach via an intermediate, regular variable.
Invoke-Command `
-Session $Session `
-ScriptBlock { Stop-Process -ProcessName $using:env:process -Force }
[1] 它適用于Start-Job,但奇怪的是不適用于遠程Invoke-Command呼叫。
uj5u.com熱心網友回復:
或者,如果這讓你感覺更輕松......
$Session = New-PSSession $env:Hostname
$Process = $ENV:Process
Invoke-Command -Session $Session -ScriptBlock {
Stop-Process -ProcessName $Using:Process -Force
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521955.html
標籤:电源外壳詹金斯调用命令
上一篇:Powershell.contains()檢查不區分大小寫
下一篇:如何在根目錄下列出命名空間?
