■ 上海 崔陽
編者按:在PowerShell 中,Invoke-Command 命令用于在本地或遠(yuǎn)程計算機上運行命令,并從命令返回所有輸出,包括錯誤信息。本文筆者通過實踐總結(jié)出使用技巧,分享給讀者。
首先,當(dāng)我們要在本地或遠(yuǎn)程計算機上運行一條命令時,我們可以用以下命令行去實現(xiàn):
In voke-Comm and-Computer Name < MACHINENAME > -Scriptblock {
其 中,MACHINENAME 是本地或遠(yuǎn)程計算機的名字,COMMAND 是 你 要 運 行的 命 令,例 如:Invoke-Command -ComputerName bjbffo 3 0 ads 001 -Script Block {g e tchilditem d:}
通常情況下,你可能需要去執(zhí)行一系列(多條)的命令才能達(dá)到你的操作目標(biāo),這時候如果你仍然使用上面的命令形式,每次Invoke 一條命令,你就需要進(jìn)行一次建立連接和釋放連接的過程。為了提高命令執(zhí)行速度,降低系統(tǒng)開銷,我們可以引入-Session 參數(shù),如下所示:
In voke-Comm and-Session
這樣你先定義了一個Session 變 量,Session 變量可以重復(fù)使 用, 每 次Invoke 一條命令時把Session變量直接加進(jìn)去就可以使用了,不用重復(fù)定義。 例 如:$s = New-PSSession -ComputerName BJBFFO30ADS001
In voke-Comm and-Session $s -ScriptBlock {get-childitem c:}
In voke-Comm and-Session $s -ScriptBlock {get-childitem d:}
在執(zhí)行Invoke-Command命令時,我們也可以傳入外部參數(shù),通常情況下,我們可以傳入以下類型的參數(shù):
傳入字符串:
Invoke-Command -Scrip tBlock { param([string]$tem) $item } -ArgumentLi st “Hello”
傳入變量:
$somestring = “Hello again!”
Invoke-Command -Scrip tBlock { param([string]$item) $item } -ArgumentL ist $somestring
傳入數(shù)組:
In voke-Comm and-ScriptBlock { param([arr ay]$item) $item } -Argume ntList @("Hello", "World")
當(dāng)傳入數(shù)組時,你會發(fā)現(xiàn)結(jié)果只會返回當(dāng)前的第一個元素,為了解決這個問題,我們需要在數(shù)組前加入一個逗號,引入空數(shù)組元素,如下所示:
$array = @("hello","w orld")
In voke-Comm and-ScriptBlock { param([ar ray]$item) $item } -Argu mentList @(,$array)
我們還可以用Invoke-Command 來遠(yuǎn)程地執(zhí)行本 地 的function,這 時候我們要把原來命令行中 的“Scriptblock {}”更 改 為“scriptblock ${function:
function Get-ItemsCr eatedLastweek
{
$date = (get-date).AddDays(-7)
$items = Get-ChildIte m D: |?{$_.lastwritetime -gt $date}
return $items
}
Invoke-Command -Compu terName shaffo30lg001 -ScriptBlock ${function:Get-ItemsCreatedLastwee k}
當(dāng)需要遠(yuǎn)程執(zhí)行的本地function 有參數(shù)時,可以有以下幾種執(zhí)行方式。
當(dāng)參數(shù)為單參數(shù)字符串類型時:
function Get-ItemsCre atedByDate
{
param($date)
$items = Get-ChildIt em D: |?{$_.lastwriteti me -gt $date}
return $items
}
Invoke-Command -ComputerName shaffo30lg001 -ScriptBlock ${function:G et-ItemsCreatedByDate} ` -ArgumentList '2019-10-13'
當(dāng)參數(shù)為單參數(shù)數(shù)組類型時:
function Get-ItemsCr eatedByDate
{
param($locations)$items = @()
foreach($lct in $loca tions)
{
$items += Get-ChildIt em $lct
}
return $items
}
$locations = @("c:","D:")
Invoke-Command -Compu terName shaffo30lg001 -Sc riptBlock ${function:Get-I tems Created By Date} `-ArgumentList @(,$locat ions)
當(dāng)參數(shù)為
多參數(shù)類型時:
function Get-exItem
{param($location,$date)
$items = Get-ChildIte m $location |?{$_.lastwri tetime -gt $date}
return $items
}
Invoke-Command -Compu terName shaffo30lg001 -ScriptBlock ${function:G et-exItem} -ArgumentList ` @('D:21V-GalOpsDigicerts','2018-05-23')
當(dāng)參數(shù)類型為數(shù)組時:
function Get-ItemsCre atedByDate
{param($date,$locations)
$items = @()
foreach($lct in $loca tions)
{
$items += Get-ChildItem $ lct | ? { $ _ .lastwritetim e -gt $date}
return $items
}
}
$locations = @("c:","d:")
Invoke-Command -Compu terName shaffo30lg001 -ScriptBlock ${function:Get-ItemsCreatedByDate} ` -ArgumentList @('2019-10-10',@(,$locations))
以上是命令的使用技巧,大家可以作為參考,并加以體會和運用。