2012-08-08 9 views
8

Espero que esta sea una pregunta simple. Tengo una función Powershell que opera en todos los archivos de una carpeta determinada. Hay momentos en que me gustaría que la función funcione en una sola carpeta y las veces en que me gustaría que funcione en varias carpetas, cuyas rutas se almacenan en una matriz. ¿Hay alguna manera de que una función sea capaz de aceptar un solo elemento y una matriz?Pase cadena o matriz de cadena a una función en Powershell

Do-Stuff $aSingleFolder 

Do-Stuff $anArrayofFolders 

Respuesta

9

También puede ejecutar la sección de proceso dentro de la función. Se vería así:

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 

Luego, cuando llame a la Función. Hágalo así

$Folders | Do-Stuff 

Esto es lo que sucederá. Todo en el bloque Begin se ejecutará primero. Luego, para cada elemento en la variable $Folders, se ejecutará todo en el bloque Process. Después de que complete eso, ejecutará lo que está en el bloque End. De esta forma puede canalizar tantas carpetas como desee a su función. Esto es realmente útil si desea agregar parámetros adicionales a esta función algún día.

+0

Impresionante. Gracias Nick. – mack

+0

No hay problema, definitivamente prefiero hacer funciones como esta, incluso si son pequeñas. Ha habido algunas horas perdidas reescribiendo una función para trabajar en una escala mayor. ¡Que tengas una buena semana! – Nick

+3

Tenga en cuenta que, como se declara utilizando '[String] $ Folders', esta función _sólo_ funcionará para múltiples valores pasados ​​a través de la canalización. Si cambia la declaración del parámetro a '[string []] $ Folders', entonces puede 'foreach ($ f in $ Folders)' en el bloque 'process' y funcionará para' Do-Stuff ',' Do -Stuff , ', y' , | Do-Stuff'. (Ah, y los backticks son innecesarios: corchetes abiertos y paréntesis cuentan como continuaciones :) –

7

En Powershell, puede iterar sobre una matriz y un único elemento de una manera uniforme:

function Do-Stuff($folders) { 
    foreach($f in $folders) { 
     //do something with $f 
    } 
} 

El paso de un solo elemento hará que el foreach para ser ejecutado una vez con el elemento dado.

Do-Stuff "folder" 
Do-Stuff "folder1", "folder2",... 
+0

Vale , Me siento tonto. :) ¡Eso fue muy fácil! Lo que hice fue cambiar la declaración de función de Do-Stuff ([string] $ folder) a Do-Stuff ($ folder) y parece estar funcionando. Probé el ciclo foreach, pero recibí un mensaje de error que decía "... El formato de la ruta dada no es compatible" porque la "ruta determinada" tenía varios valores de la matriz. Ahora estoy llamando a la función de esta manera: Do-Stuff $ carpeta Do-Stuff $ folderArray ¿Por qué no tengo que incluir la [cadena] al declarar los parámetros de la función? – mack

0

Esto funciona sin cmd.exe y uso de archivos:

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 
} 

Uso: No se olvide de la longitud del terminal 0 de su salida y se colgarán o

PS C:\> $Command = "terminal lenght 0 
>> show running-config 
>> exit 
>> " 
>> 
PS C:\> Invoke-PlinkCommandsIOS -Host ace-dc1 -Credential $cred -Commands $Command 

....

Cuestiones relacionadas