Siento que me falta algo que debería ser obvio, pero no puedo entender cómo hacerlo.¿Cómo incluyo una función definida localmente cuando uso el Invoke-Command de PowerShell para la comunicación remota?
Tengo un script ps1 que tiene una función definida en él. Llama a la función y luego intenta usarla de forma remota:
function foo
{
Param([string]$x)
Write-Output $x
}
foo "Hi!"
Invoke-Command -ScriptBlock { foo "Bye!" } -ComputerName someserver.example.com -Credential [email protected]
Este breve script de ejemplo imprime "¡Hola!" y luego se cuelga diciendo "El término 'foo' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable".
Entiendo que la función no está definida en el servidor remoto porque no está en ScriptBlock. Podría redefinirlo allí, pero preferiría no hacerlo. Me gustaría definir la función una vez y usarla local o remotamente. ¿Existe una forma correcta de hacer esto?
Bueno, eso suena similar a algo que hubiera leído. Así que, yendo un paso más allá: ¿hay una buena manera de incluir la función y algunas líneas adicionales de script que usan la función? –
No he probado esto todavía, pero si desea formatear la salida de la función (por ejemplo), esto debería funcionar: '-ScriptBlock {$ función: foo | formato-tabla -auto}'. Básicamente, cualquier 'ScriptBlock' puede ser cualquier" porción "de código válido de PowerShell, por lo que siempre que lo formatee adecuadamente (o use puntos y comas al final de cada" línea "), debería estar bien. El día de hoy estaba haciendo el tonto con 'measure-command {$ x = [xml] (get-content file.xml); $ x.selectsinglenode (" // thing ");}, por ejemplo. – alroc