我希望这是一个简单的问题。我有一个Powershell函数,可以对给定文件夹中的所有文件进行操作。有时我想让这个功能在一个文件夹上运行,有时候我希望它能在几个文件夹上运行,其中的路径存储在一个数组中。有没有办法让一个函数能够接受单个元素和一个数组?
Do-Stuff $aSingleFolder
Do-Stuff $anArrayofFolders
答案 0 :(得分:9)
您还可以在该功能中运行流程部分。它看起来像这样:
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
块中的内容。这样,您可以根据需要将多个文件夹传输到函数中。如果你想在某天向这个函数添加其他参数,这非常有用。
答案 1 :(得分:7)
在Powershell中,您可以以统一的方式迭代数组和单个元素:
function Do-Stuff($folders) {
foreach($f in $folders) {
//do something with $f
}
}
传递单个元素将导致foreach在给定项目下执行一次。
Do-Stuff "folder"
Do-Stuff "folder1", "folder2",...
答案 2 :(得分:0)
这不使用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
...