Aceptar valor de la function Powershell de la tubería

Me gustaría crear un script que le diga al usuario si PSRemoting está habilitado en múltiples máquinas remotas. Esto es lo que tengo hasta ahora:

function Test-PSRemoting { Param( [Parameter(Mandatory=$True, ValueFromPipeline=$True)] [string[]] $ComputerName, [string] $Cnetworkingential) $file = Read-Host "Enter file location for all error details: " try { $result = Invoke-Command -ComputerName $ComputerName -Cnetworkingential $Cnetworkingential { 1 } -ErrorAction SilentlyContinue -ErrorVariable Problem If ($Problem){ $result = 0} } catch { $result = 0} If ($result -eq 1){ write-host "PSRemoting is enabled on: " $ComputerName } else { write-host "PSRemoting is not enabled/working on: " $ComputerName $Problem | Out-File $file -Append} } 

La function funciona perfectamente si sólo especifico una computadora:

 Test-PSRemoting -ComputerName Server1 - Cnetworkingentials Admin 

Sin embargo, no puedo conseguir que funcione la function si especifico varios equipos:

 Test-PSRemoting -ComputerName Server1, Server2 - Cnetworkingentials Admin Server1, Server2 | Test-PSRemoting -Cnetworkingentials Admin 

2 Solutions collect form web for “Aceptar valor de la function Powershell de la tubería”

Utilizaría el process {} bloque en este caso (también contesta su comentario sobre porqué él estaba comprobando solamente Server2).

 function test-ps { param( [Parameter(ValueFromPipeline=$true)] [string[]] $CN ) process{ Write-Host $CN "h" } } 'test1','test2' | test-ps 

http://ss64.com/ps/syntax-function-input.html

Pruebe lo siguiente, los comentarios a continuación señalan los puntos key.

 function Test-PSRemoting { [CmdletBinding()] param ( [Parameter(Mandatory = $True, ValueFromPipeline = $True)] [string[]]$ComputerName, [Parameter(Mandatory = $False)] [System.Management.Automation.PSCnetworkingential]$Cnetworkingential = (Get-Cnetworkingential), [Parameter(Mandatory = $True)] [String]$OutFile ) process { # Pass computer name along the pipeline to allow for more then one. $ComputerName | % ` { $pcName = $_; $problem = $Null; try { $result = Invoke-Command -ComputerName $pcName -Cnetworkingential $Cnetworkingential { 1 } -ErrorAction SilentlyContinue -ErrorVariable problem; if ($problem -eq $Null -and $result -eq 1) { # Use Write-Verbose instead. Test-* commands are meant to return true/false. # But additional status can be viewed by adding the -Verbose parameter to Test-PSRemoting. ie Test-PSRemoting -Verbose Write-Verbose "PSRemoting is enabled on: $pcName"; return $True; } else { Write-Verbose "PSRemoting is not enabled/working on: $pcName"; $problem | Out-File $OutFile -Append; return $False; } } catch { return $False } } } } 

Los puntos key son:

  • Uso de $ComputerName | para permitir el uso de Test-PSRemoting -ComputerName Server1,Server2 al manejar la lógica condicional por nombre de equipo especificado. Invoke-Command maneja naturalmente varios nombres de computadora, pero sus sentencias if no.
  • Movió el $file a $OutFile lugar de Read-Host y marcó como parámetro obligatorio para forzar la input. Dejar Read-Host en un process { } bloque significaría que la ruta del file se solicita varias veces si Server1,Server2 | Test-PSRemoting Se utiliza Server1,Server2 | Test-PSRemoting . También tiene la ventaja de poder ser pasado como un parámetro en lugar de typescript manualmente cada vez.
  • Movió la salida verbosa a Write-Verbose lugar de Write-Host . Los commands Test- * deben devolver True / False en lugar de una cadena. Use -Verbose para ver la salida detallada. Además, usted podría cambiar la Write-Verbose "PSRemoting is not enabled/working on: $pcName"; línea a una Write-Warning lugar.
  • ¿Cuál es la mejor manera de respaldar mysql en s3?
  • Repetición de los loggings creados por script?
  • ¿Cómo escribir en un file y, mientras el file aún está siendo escrito, leer y analizar su contenido mediante un script de shell?
  • ¿Cómo usar un file de configuration (ini, conf, ...) con una secuencia de commands Powershell? ¿Es posible?
  • Retener session SSH en guión bash
  • La secuencia de commands FTP necesita una línea en blanco
  • Creación de acciones
  • Se requiere una plantilla DDASD
  • Ejecución de scripts de Python en linux
  • Necesita ayuda con el error Powershell "El lado izquierdo de un operador de asignación ..."
  • Lista de grupos y usuarios en Windows 2003 Server
  • El linux y los temas del servidor de Windows, como ubuntu, centos, apache, nginx, debian y consejos de red.