Il cmdlet PowerShell Invoke-Expression può essere facile da fraintendere quando e quando non usarlo. In questo articolo, ho messo insieme una serie di domande frequenti principali. Le dividerò e includerò tonnellate di esempi utili a cui fare riferimento ogni volta che potrebbe essere necessario. Ciò significa che dovresti segnare questa pagina subito!
Vuoi altri consigli come questo? Dai un’occhiata al mio blog personale PowerShell su: https://www.nkasco.com/
Cosa è Invoke-Expression?
La descrizione ufficiale, secondo Microsoft, è: “Il cmdlet Invoke-Expression valuta o esegue una stringa specificata come comando e restituisce i risultati dell’espressione o del comando. Senza Invoke-Expression, una stringa inviata alla riga di comando verrebbe restituita (echo) invariata.”
In altre parole, può essere utile per chiamare il codice all’interno di uno script o costruire comandi da eseguire successivamente. Può anche essere usato con cautela in combinazione con l’input fornito dall’utente.
L’esempio più semplice di utilizzo di Invoke-Expression è la definizione di uno script e l’invio di quella stringa al parametro Command. Invoke-Expression quindi esegue quella stringa.
Cosa succede se ho spazi nel percorso dello script?
Assicurati di racchiudere le stringhe tra singoli o doppi apici.
Ad esempio, se desideri eseguire una stringa con uno spazio nel percorso, queste opzioni non funzioneranno:
Perché? Perché è esattamente la stessa cosa che digitare direttamente nella console di PowerShell:
Tuttavia, se racchiudi l’elemento del percorso tra singoli o doppi apici con l’intera stringa tra apici, Invoke-Expression
eseguirà lo script come previsto.
Q. How do you pass parameters to scripts invoked with Invoke-Expression
?
L’unico parametro che Invoke-Expression
ha è Command
. Non esiste un modo nativo per passare parametri con Invoke-Expression
. Tuttavia, puoi includerli nella stringa che passi al parametro Command
.
Supponiamo di avere uno script con due parametri chiamati Path
e Force
. Invece di utilizzare un parametro specifico tramite Invoke-Expression
, puoi passare i parametri a tale script come faresti di solito tramite la console.
Se di solito chiami questo script in questo modo tramite la console:
Dovrai includere l’intera riga in una stringa e passare quella stringa al parametro Command
.
Ha senso usare try/catch con Invoke-Expression?
Non proprio. Ciò significa che devi utilizzare la gestione degli errori all’interno del tuo parametro Command
.
Esempio:
Qual è la differenza tra Invoke-Expression
e l’operatore di chiamata (&
)?
L’operatore di chiamata (&) è ottimo per eseguire rapidamente un comando, uno script o un blocco di script. Tuttavia, l’operatore di chiamata non analizza il comando. Non può interpretare i parametri del comando come può fare Invoke-Expression.
Ad esempio, forse vorrei ottenere il processo di PowerShell Core utilizzando il cmdlet Get-Process
con il codice Get-Process -ProcessName pwsh
. Concatenare Get-Process
e il parametro non funzionerà come previsto utilizzando l’operatore di chiamata.
Ma se esegui questa stringa con Invoke-Expression
, funzionerà come previsto.
Qual è la differenza tra Invoke-Expression
e Start-Process
?
Il cmdlet Start-Process
fornisce un codice di ritorno o di uscita nell’oggetto restituito. Ti permette di aspettare che il processo chiamato si completi e ti permette di lanciare un processo con credenziali Windows diverse. Invoke-Expression
è veloce e sporco mentre Start-Process
può essere più utile per interpretare i risultati del processo eseguito.
Qual è la differenza tra Invoke-Expression
e Invoke-Command
?
Invoke-Expression
converte solo una stringa in codice eseguibile. Invoke-Command
, d’altra parte, sfrutta PowerShell Remoting fornendoti la possibilità di invocare codice localmente o remotamente su computer.
Invoke-Command
è preferibile se stai scrivendo i comandi eseguiti ora, poiché conservi l’intellisense nel tuo IDE, mentre Invoke-Expression
sarebbe preferibile se volessi chiamare un altro script da quello corrente.
Esempio:
Qual è la differenza tra Invoke-Expression
e Invoke-Item
?
Il cmdlet Invoke-Item
offre il supporto in linea per percorsi multipli per aprire documenti con la loro azione predefinita, con parametri per inclusione, esclusione, aggiunta di credenziali e persino conferma per una sicurezza aggiuntiva.
Invoke-Expression è sicuro?
A. If someone had malicious intent they might be able to trick some virus programs by masking malicious code that constructs itself during runtime. Invoke-Expression
will happily execute whatever text is passed to it’s Command
parameter.
Esempio:
Quali sono alcune best practices per eseguire comandi/espressioni multiple?
Se hai diversi comandi da eseguire, anche se Invoke-Expression
accetta solo una stringa invece di un array, possiamo utilizzare la pipeline di PowerShell per inviare oggetti giù per la pipeline uno alla volta.
Esempio:
Come posso utilizzare Invoke-Expression
con l’input dell’utente?
Dovresti essere molto cauto nell’usare Invoke-Expression con l’input dell’utente. Se permetti un prompt a un utente in modo che possa accedere al di fuori del comando che intendi eseguire, potrebbe creare una vulnerabilità indesiderata. Ecco un modo per implementare in modo sicuro l’input dell’utente con Invoke-Expression
.
Conclusione
Ogni cmdlet ha il proprio posto e Invoke-Expression
è uno che praticamente tutti incontreranno prima o poi. È importante comprendere i pro e i contro dei cmdlet utilizzati frequentemente in modo da implementarli in modo da prepararsi al successo. Sono curioso di sentire come hai usato Invoke-Expression
per risolvere alcune delle tue sfide personali, lascia un commento qui sotto e condividi la tua storia!
Vuoi altri consigli come questo? Dai un’occhiata al mio blog personale PowerShell su: https://www.nkasco.com/