Comando “complexo” de início rápido de dentro do PowerShell

Oct 20 2020

É possível executar comandos "complexos" do PowerShell de dentro do PowerShell usando um alias?

Para dar um exemplo, gostaria de substituir o comando Get-VpnConnection -name "VPNname"por meio de um comando de uma palavra (não reservado), por exemplo, por vpnmeio de um alias? Infelizmente set-Alias vpn "Get-VpnConnection -name VPNname"não funciona, nem funciona set-Alias vpn Get-VpnConnection -name "VPNname"(observe a posição diferente da primeira aspa).

Até agora, minha "solução alternativa" é salvar o comando como um arquivo de script no "diretório de inicialização" do PowerShells (no meu caso C:\Users\username) e executar .\vpn.ps1por meio de um alias. Eu crio o alias usando set-Alias vpn ".\script_vpncheck.ps1". Existe uma maneira direta de fazer isso (sem criar um arquivo de script)?

Pergunta de acompanhamento: Caso isso não seja possível, gostaria de inicializar os aliases usando um arquivo de script, por exemplo, via .\script.ps1(Observação: não preciso armazená-los permanentemente). Infelizmente, isso não funciona. O arquivo parece ter sido executado, mas os aliases não funcionam. Alguma ideia do porquê?

Respostas

3 phuclv Oct 20 2020 at 13:25

Basta armazenar o alias no perfil

  • Abra o perfil do PowerShell executando notepad $PROFILE(ou use qualquer editor favorito seu)
  • Digite os comandos que deseja executar nesse arquivo e salve (por exemplo Set-Alias)
  • Reinicie o PowerShell ou forneça o perfil recém-atualizado executando . $PROFILE

O perfil é exatamente como .bashrcno bash, que será executado quando o shell for iniciado. Além de apelidos, você também pode escrever funções para coisas mais complexas. Eles estarão disponíveis após o PowerShell iniciar

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

Você não pode definir um apelido para comandos com argumentos, então você deve criar uma função nesse caso

O motivo pelo qual seu arquivo ps1 não funciona é porque ele é executado no subshell e, quando o subshell é fechado, tudo será limpo, incluindo os novos aliases. Você deve originar o script usando o operador dot source .(semelhante ao .bash) para executá-lo no shell atual

. .\script.ps1

Mas em vez de buscar isso toda vez que você quiser o alias, basta fazer isso permanentemente no perfil como acima

1 KeithMiller Oct 20 2020 at 17:41

Os aliases não se destinam a receber parâmetros. Do about_aliasestópico de ajuda:

NOMES ALTERNATIVOS PARA COMANDOS COM PARÂMETROS

Você pode atribuir um alias a um cmdlet, script, função ou arquivo executável. Você não pode atribuir um alias a um comando e seus parâmetros. Por exemplo, você pode atribuir um alias ao cmdlet Get-Eventlog, mas não pode atribuir um alias ao comando Get-Eventlog -LogName System.

Você pode criar uma função que inclua o comando. Para criar uma função, digite a palavra "função" seguida de um nome para a função. Digite o comando e coloque-o entre colchetes ({}).

Por exemplo, o comando a seguir cria a função syslog. Esta função representa o comando Get-Eventlog -LogName System:

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

Agora você pode digitar "syslog" em vez do comando. E você pode criar aliases para a nova função.

Mas você não precisa de um arquivo de script separado. Você pode definir uma função simples e adicioná-la ao seu perfil com o seguinte código:

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

O comando vpnestará disponível em todas as sessões do PowerShell daquele ponto em diante.