Comando "complesso" di avvio rapido dall'interno di PowerShell

Oct 20 2020

È possibile eseguire comandi PowerShell "complessi" dall'interno di PowerShell utilizzando un alias?

Per darti un esempio, vorrei sostituire il comando Get-VpnConnection -name "VPNname"tramite un comando di una parola (non riservato), ad esempio vpntramite un alias? Purtroppo set-Alias vpn "Get-VpnConnection -name VPNname"non funziona, né funziona set-Alias vpn Get-VpnConnection -name "VPNname"(notare la diversa posizione delle prime virgolette).

Finora la mia "soluzione alternativa" è salvare il comando come file di script nella "directory di avvio" di PowerShells (nel mio caso C:\Users\username) ed eseguirlo .\vpn.ps1tramite un alias. Creo l'alias usando set-Alias vpn ".\script_vpncheck.ps1". C'è un modo diretto per farlo (senza creare un file di script)?

Domanda di follow-up: nel caso in cui ciò non sia possibile, vorrei inizializzare gli alias utilizzando un file di script, ad esempio tramite .\script.ps1(Nota: non è necessario memorizzarli in modo permanente). Purtroppo questo non funziona. Il file sembra essere eseguito ma gli alias non funzionano. Qualche idea sul perché?

Risposte

3 phuclv Oct 20 2020 at 13:25

Basta memorizzare l'alias nel profilo

  • Apri il profilo da PowerShell eseguendolo notepad $PROFILE(o usa un tuo editor preferito)
  • Inserisci i comandi che desideri eseguire in quel file e salva (ad esempio Set-Alias)
  • Riavviare PowerShell o generare il profilo appena aggiornato eseguendo . $PROFILE

Il profilo è esattamente come .bashrcin bash che verrà eseguito all'avvio della shell. Oltre agli alias puoi anche scrivere funzioni per cose più complesse. Saranno disponibili dopo l'avvio di PowerShell

function vpn($url) { Get-VpnConnection -name $url }
Set-Alias -Name vpn -Value Get-VpnConnection

Non è possibile impostare alias per comandi con argomenti, quindi è necessario creare una funzione in questo caso

Il motivo per cui il file ps1 non funziona è perché viene eseguito nella subshell e quando la subshell si chiude, tutto verrà cancellato, inclusi i nuovi alias. È necessario generare lo script utilizzando l'operatore punto sorgente .(simile a .bash) per eseguirlo nella shell corrente

. .\script.ps1

Ma invece di procurartelo ogni volta che vuoi l'alias, fallo in modo permanente nel profilo come sopra

1 KeithMiller Oct 20 2020 at 17:41

Gli alias non sono destinati a prendere parametri. Dall'argomento della guida about_aliases:

NOMI ALTERNATIVI PER COMANDI CON PARAMETRI

È possibile assegnare un alias a un cmdlet, script, funzione o file eseguibile. Non è possibile assegnare un alias a un comando e ai suoi parametri. Ad esempio, è possibile assegnare un alias al cmdlet Get-Eventlog, ma non è possibile assegnare un alias al comando Get-Eventlog -LogName System.

È possibile creare una funzione che includa il comando. Per creare una funzione, digita la parola "funzione" seguita da un nome per la funzione. Digita il comando e racchiudilo tra parentesi graffe ({}).

Ad esempio, il seguente comando crea la funzione syslog. Questa funzione rappresenta il comando Get-Eventlog -LogName System:

function Get-SystemEventlog {Get-Eventlog -LogName System}
Set-Alias -Name syslog -Value Get-SystemEventlog

È ora possibile digitare "syslog" invece del comando. Inoltre, puoi creare alias per la nuova funzione.

Ma non hai bisogno di un file di script separato. Puoi definire una semplice funzione e aggiungerla al tuo profilo con il seguente codice:

'Function vpn { Get-VpnConnection -name VPNname }' | Add-Content $PROFILE

Il comando vpnsarà disponibile in tutte le sessioni di PowerShell da quel momento in poi.