我希望這是一個簡單的問題。我有一個Powershell功能,可以對給定文件夾中的所有文件進行操作。有些時候,我想讓這個功能在一個文件夾上運行,並且我希望它能夠在多個文件夾上運行,這些文件夾的路徑存儲在一個數組中。有沒有辦法讓一個函數能夠接受單個元素和一個數組?將字符串或字符串數組傳遞給Powershell中的函數
Do-Stuff $aSingleFolder
Do-Stuff $anArrayofFolders
我希望這是一個簡單的問題。我有一個Powershell功能,可以對給定文件夾中的所有文件進行操作。有些時候,我想讓這個功能在一個文件夾上運行,並且我希望它能夠在多個文件夾上運行,這些文件夾的路徑存儲在一個數組中。有沒有辦法讓一個函數能夠接受單個元素和一個數組?將字符串或字符串數組傳遞給Powershell中的函數
Do-Stuff $aSingleFolder
Do-Stuff $anArrayofFolders
您也可以在函數中運行流程部分。它看起來像這樣:
Function Do-Stuff {
param(
[Parameter(`
Mandatory=$True, `
Valuefrompipeline = $true)]
[String]$Folders
)
begin {
#Things to do only once, before processing
} #End Begin
Process {
#What you want to do with each item in $Folders
} #End Process
end {
#Things to do at the end of the function, after all processes are done
}#End end
} #End Function Do-Stuff
然後當你調用函數。像這樣做
$Folders | Do-Stuff
以下是會發生的事情。 Begin
塊中的所有內容都將首先運行。然後,對於$Folders
變量中的每個項目,Process
塊中的所有內容都將運行。完成後,它將運行End
區塊中的內容。這樣,您可以根據需要將多個文件夾放入您的功能中。如果您想在某一天爲此功能添加其他參數,這非常有用。
在Powershell的,可以遍歷以均勻的方式的陣列,並且單個元件:
function Do-Stuff($folders) {
foreach($f in $folders) {
//do something with $f
}
}
傳遞單個元件將導致與給定的項目執行一次在foreach。
Do-Stuff "folder"
Do-Stuff "folder1", "folder2",...
好,我覺得很愚蠢。 :)那太容易了!我所做的是將函數聲明從Do-Stuff([string] $文件夾)更改爲Do-Stuff($文件夾),它似乎正在工作。我已經嘗試了foreach循環,但是我得到一個錯誤:「......給定路徑的格式不被支持」,因爲「給定路徑」是來自數組的多個值。我現在調用這樣的函數: Do-Stuff $文件夾 Do-Stuff $ folderArray 爲什麼在聲明函數參數時不必包含[string]? – mack 2012-08-08 19:59:01
此作品,未經CMD.EXE和使用文件:
function Invoke-PlinkCommandsIOS {
param (
[Parameter(Mandatory=$true)][string] $Host,
[Parameter(Mandatory=$true)][System.Management.Automation.PSCredential] $Credential,
[Parameter(Mandatory=$true)][string] $Commands,
[Switch] $ConnectOnceToAcceptHostKey = $false
)
$PlinkPath="$PSScriptRoot\plink.exe"
$commands | & "$PSScriptRoot\plink.exe" -ssh -2 -l $Credential.GetNetworkCredential().username -pw "$($Credential.GetNetworkCredential().password)" $Host -batch
}
用法:不要忘記你的退出的和終端長度爲0,否則將掛
PS C:\> $Command = "terminal lenght 0
>> show running-config
>> exit
>> "
>>
PS C:\> Invoke-PlinkCommandsIOS -Host ace-dc1 -Credential $cred -Commands $Command
....
太棒了。謝謝Nick。 – mack 2012-08-20 18:02:34
沒問題,我絕對喜歡做這樣的功能,即使它們很小。重寫功能在更大規模上工作的時間有幾個小時。祝您有個愉快的一週! – Nick 2012-08-20 22:48:15
請注意,正如使用'[String] $ Folders'聲明的那樣,此函數將僅適用於通過管道傳遞的多個值。如果將參數聲明更改爲'[string []] $ Folders',那麼您可以''在'process'塊中foreach($ f文件夾中的$ f),它可以用於'Do-Stuff','Do -Stuff ,',和', | DO-Stuff'。 (哦,反引號是不必要的:開括號和括號計數作爲延續:) –
2012-09-09 21:48:40