我希望这是一个简单的问题。我有一个 Powershell 函数,可以对给定文件夹中的所有文件进行操作。有时我想让函数在单个文件夹上运行,有时我希望它在多个文件夹上运行,这些文件夹的路径存储在一个数组中。有没有办法让一个函数能够同时接受单个元素和数组?
Do-Stuff $aSingleFolder
Do-Stuff $anArrayofFolders
我希望这是一个简单的问题。我有一个 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",...
这在没有 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
……