Mi sento come se mi mancasse qualcosa che dovrebbe essere ovvio, ma non riesco proprio a capire come farlo.Come includere una funzione definita localmente quando si utilizza Invoke-Command di PowerShell per la comunicazione remota?
Ho uno script ps1 che ha una funzione definita in esso. Chiama la funzione e prova a utilizzarla da remoto:
function foo
{
Param([string]$x)
Write-Output $x
}
foo "Hi!"
Invoke-Command -ScriptBlock { foo "Bye!" } -ComputerName someserver.example.com -Credential [email protected]
Questo breve script di esempio stampa "Ciao!" e poi si blocca dicendo "Il termine 'pippo' non è riconosciuto come il nome di un cmdlet, una funzione, un file di script o un programma eseguibile."
Capisco che la funzione non è definita sul server remoto perché non è in ScriptBlock. Potrei ridefinirlo lì, ma preferirei di no. Mi piacerebbe definire la funzione una volta e usarla localmente o in remoto. C'è un buon modo per farlo?
Ok, sembra simile a qualcosa che avrei letto. Quindi facendo un passo in più: c'è un buon modo per includere la funzione e alcune linee aggiuntive di script che usano la funzione? –
Non ho ancora provato questo, ma se vuoi formattare l'output della funzione (per esempio), questo dovrebbe funzionare: '-ScriptBlock {$ function: foo | format-table -auto}'. Fondamentalmente ogni 'ScriptBlock' può essere un qualsiasi" pezzo "di codice PowerShell valido, quindi se lo si formatta correttamente (o si usa il punto e virgola alla fine di ogni" linea "), si dovrebbe essere buoni. All'inizio di oggi stavo girando con 'measure-command {$ x = [xml] (get-content file.xml); $ x.selectsinglenode (" // thing ");}, per esempio. – alroc