Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Breve descrição
Descreve como o PowerShell analisa comandos.
Descrição longa
Quando você insere um comando no prompt de comando, o PowerShell divide o texto do comando em uma série de segmentos chamados tokens e, em seguida, determina como interpretar cada token.
Por exemplo, se você digitar:
Write-Host book
O PowerShell divide o comando em dois tokens, Write-Host e book, e interpreta cada token de forma independente usando um dos dois principais modos de análise: modo de expressão e modo de argumento.
Observação
À medida que o PowerShell analisa a entrada do comando, ele tenta resolver os nomes dos comandos para cmdlets ou executáveis nativos. Se um nome de comando não tiver uma correspondência exata, o PowerShell substituirá Get- ao comando como um verbo padrão. Por exemplo, o PowerShell analisa Service como Get-Service. Não é recomendado usar esse recurso pelos seguintes motivos:
- É ineficiente. Isso faz com que o PowerShell pesquise várias vezes.
- Os programas externos com o mesmo nome são resolvidos primeiro, portanto, você não pode executar o cmdlet pretendido.
-
Get-HelpeGet-Commandnão reconhecem nomes sem verbos. - O nome do comando pode ser uma palavra reservada ou uma palavra-chave de idioma.
Processé ambos, e não pode ser resolvido paraGet-Process.
Modo de expressão
O modo de expressão destina-se à combinação de expressões, necessária para a manipulação de valores em uma linguagem de script. As expressões são representações de valores na sintaxe do PowerShell e podem ser simples ou compostas, por exemplo:
Expressões literais são representações diretas de seus valores:
'hello'
32
As expressões variáveis carregam o valor da variável a que se referem:
$x
$script:path
Os operadores combinam outras expressões para avaliação:
-12
-not $Quiet
3 + 7
$input.Length -gt 1
- Os literais de cadeia de caracteres devem estar entre aspas.
- Os números são tratados como valores numéricos e não como uma série de caracteres (a menos que escapem).
-
Operadores, incluindo operadores unários como
-e-note operadores binários como+e-gt, são interpretados como operadores e aplicam suas respetivas operações em seus argumentos (operandos). -
Expressões de atributo e conversão são analisadas como expressões e aplicadas a expressões subordinadas. Por exemplo:
[int] '7'. - As referências de variáveis são avaliadas em seus valores, mas de splatting é proibida e causa um erro de analisador.
- Qualquer outra coisa é tratada como um comando a ser invocado.
Modo de argumento
Ao analisar, o PowerShell primeiro procura interpretar a entrada como uma expressão. Mas quando uma invocação de comando é encontrada, a análise continua no modo de argumento. Se você tiver argumentos que contenham espaços, como caminhos, deverá colocar esses valores de argumento entre aspas.
O modo de argumento foi projetado para analisar argumentos e parâmetros para comandos em um ambiente de shell. Toda a entrada é tratada como uma cadeia de caracteres expansível, a menos que use uma das seguintes sintaxes:
O cifrão (
$) seguido de um nome de variável inicia uma referência variável, caso contrário, é interpretado como parte da cadeia expansível. A referência a uma variável pode incluir acesso a membro ou indexação.- Caracteres adicionais após referências de variáveis simples, como
$HOME, são considerados parte do mesmo argumento. Coloque o nome da variável entre chaves ({}) para separá-lo dos caracteres subsequentes. Por exemplo,${HOME}. - Quando a referência da variável inclui acesso de membro, o primeiro de quaisquer caracteres adicionais é considerado o início de um novo argumento. Por exemplo,
$HOME.Length-moreresulta em dois argumentos: o valor de$HOME.Lengthe a cadeia de caracteres literal-more.
- Caracteres adicionais após referências de variáveis simples, como
As aspas (
'e") iniciam as cadeias de caracteresAs chaves (
{}) iniciam novos blocos de scriptAs vírgulas (
,) introduzem listas passadas como matrizes, a menos que o comando que está sendo chamado seja um aplicativo nativo, caso em que elas são interpretadas como parte da cadeia de caracteres expansível. Não há suporte para vírgulas iniciais, consecutivas ou finais.Parênteses (
()) iniciam uma nova expressãoO operador de subexpressão (
$()) inicia uma expressão incorporadaInicial no sinal (
@) inicia sintaxes de expressão como splatting (@args), matrizes (@(1,2,3)) e literais de tabela de hash (@{a=1;b=2}).(),$()e@()no início de um token criam um novo contexto de análise que pode conter expressões ou comandos aninhados.- Quando seguido por caracteres adicionais, o primeiro caractere adicional é considerado o início de um novo argumento separado.
- Quando precedido por um literal não citado,
$()funciona como uma cadeia de caracteres expansível,()inicia um novo argumento que é uma expressão, e@()é interpretado como um literal@com()iniciando um novo argumento que é uma expressão.
Todo o resto é tratado como uma cadeia de caracteres expansível, exceto metacaracteres que ainda precisam escapar. Consulte Manipulação de caracteres especiais.
- Os metacaracteres de modo argumento (caracteres com significado sintático especial) são:
<space> ' " ` , ; ( ) { } | & < > @ #. Destes,< > @ #só são especiais no início de um token.
- Os metacaracteres de modo argumento (caracteres com significado sintático especial) são:
O token de interrupção de análise (
--%) altera a interpretação de todos os argumentos restantes. Para obter mais informações, consulte a seção sobre o token de interrupção de análise abaixo.
Exemplos
A tabela a seguir fornece vários exemplos de tokens processados no modo de expressão e no modo de argumento e a avaliação desses tokens. Para esses exemplos, o valor da variável $a é 4.
| Exemplo | Modo | Resultado |
|---|---|---|
2 |
Expressão | 2 (inteiro) |
`2 |
Expressão | "2" (comando) |
Write-Output 2 |
Expressão | 2 (inteiro) |
2+2 |
Expressão | 4 (inteiro) |
Write-Output 2+2 |
Argumento | "2+2" (string) |
Write-Output(2+2) |
Expressão | 4 (inteiro) |
$a |
Expressão | 4 (inteiro) |
Write-Output $a |
Expressão | 4 (inteiro) |
$a+2 |
Expressão | 6 (inteiro) |
Write-Output $a+2 |
Argumento | "4+2" (cadeia de caracteres) |
$- |
Argumento | "$-" (comando) |
Write-Output $- |
Argumento | $- (cadeia de caracteres) |
a$a |
Expressão | "a$a" (comando) |
Write-Output a$a |
Argumento | "a4" (corda) |
a'$a' |
Expressão | "a$a" (comando) |
Write-Output a'$a' |
Argumento | "a$a" (corda de caracteres) |
a"$a" |
Expressão | "a$a" (comando) |
Write-Output a"$a" |
Argumento | "a4" (corda) |
a$(2) |
Expressão | "a$(2)" (comando) |
Write-Output a$(2) |
Argumento | "a2" (corda) |
Cada token pode ser interpretado como algum tipo de objeto, como Boolean ou String. O PowerShell tenta determinar o tipo de objeto a partir da expressão. O tipo de objeto depende do tipo de parâmetro esperado por um comando e se o PowerShell sabe como converter o argumento para o tipo correto. A tabela a seguir mostra vários exemplos dos tipos atribuídos aos valores retornados pelas expressões.
| Exemplo | Modo | Resultado |
|---|---|---|
Write-Output !1 |
argumento | "!1" (string) |
Write-Output (!1) |
expressão | Falso (Booleano) |
Write-Output (2) |
expressão | 2 (inteiro) |
Set-Variable AB A,B |
argumento | 'A','B' (matriz) |
CMD /CECHO A,B |
argumento | A,B |
CMD /CECHO $AB |
expressão | 'A B' (matriz) |
CMD /CECHO :$AB |
argumento | ':A B' (string) |
Manipulação de caracteres especiais
O caractere backtick (`) pode ser usado para escapar de qualquer caractere especial em uma expressão. Isso é mais útil para escapar dos metacaracteres de modo de argumento que você deseja usar como caracteres literais em vez de como um metacaractere. Por exemplo, para usar o cifrão ($) como um literal em uma cadeia de caracteres expansível:
"The value of `$ErrorActionPreference is '$ErrorActionPreference'."
The value of $ErrorActionPreference is 'Continue'.
Continuação da linha
O caractere backtick também pode ser usado no final de uma linha para permitir que você continue a entrada na próxima linha. Isso melhora a legibilidade de um comando que usa vários parâmetros com nomes longos e valores de argumento. Por exemplo:
New-AzVm `
-ResourceGroupName "myResourceGroupVM" `
-Name "myVM" `
-Location "EastUS" `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-Credential $cred
No entanto, deve-se evitar o uso da continuação de linhas.
- Os caracteres backtick podem ser difíceis de ver e fáceis de esquecer.
- Um espaço extra após o backtick quebra a continuidade da linha. Como o espaço é difícil de ver, pode ser difícil encontrar o erro.
O PowerShell fornece várias maneiras de quebrar linhas em pontos naturais da sintaxe.
- Caracteres após barra vertical (
|) - Depois de operadores binários (
+,-,-eq, etc.) - Após vírgulas (
,) numa lista - Depois de abrir caracteres como
[,{,(
Para um grande conjunto de parâmetros, em vez disso, use splatting. Por exemplo:
$parameters = @{
ResourceGroupName = "myResourceGroupVM"
Name = "myVM"
Location = "EastUS"
VirtualNetworkName = "myVnet"
SubnetName = "mySubnet"
SecurityGroupName = "myNetworkSecurityGroup"
PublicIpAddressName = "myPublicIpAddress"
Credential = $cred
}
New-AzVm @parameters
Passando argumentos para comandos nativos
Ao executar comandos nativos do PowerShell, os argumentos são primeiro analisados pelo PowerShell. Os argumentos analisados são então unidos em uma única cadeia de caracteres com cada parâmetro separado por um espaço.
Por exemplo, o comando a seguir chama o programa icacls.exe.
icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
Para executar esse comando no PowerShell 2.0, você deve usar caracteres de escape para evitar que o PowerShell interprete incorretamente os parênteses.
icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F
O token de interrupção de análise
A partir do PowerShell 3.0, você pode usar o token stop-parsingentrada como comandos ou expressões do PowerShell.
Observação
O token de interrupção de análise destina-se apenas ao uso de comandos nativos em plataformas Windows.
Ao chamar um comando nativo, coloque o token de paragem de análise antes dos argumentos do programa. Esta técnica é muito mais fácil do que usar caracteres de fuga para evitar interpretações erradas.
Quando encontra um token de fim de análise, o PowerShell interpreta os caracteres restantes na linha como literais. A única interpretação que ele executa é substituir valores por variáveis de ambiente que usam notação padrão do Windows, como %USERPROFILE%.
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
O PowerShell envia a seguinte cadeia de caracteres de comando para o programa icacls.exe:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F
O token de análise de parada é efetivo somente até o próximo caractere de nova linha ou pipeline. Não é possível usar o caractere de continuação de linha (`) para estender seu efeito ou usar um delimitador de comando (;) para encerrar seu efeito.
Para além das referências a variáveis de ambiente %variable%, não podes incorporar nenhum outro elemento dinâmico no comando. Escapar de um carácter % como %%, tal como se pode fazer dentro de ficheiros em lote, não é suportado.
%<name>% tokens são invariavelmente expandidos. Se <name> não se referir a uma variável de ambiente definida, o token será passado por as-is.
Você não pode usar o redirecionamento de fluxo (como >file.txt) porque eles são passados literalmente como argumentos para o comando de destino.
No exemplo a seguir, a primeira etapa executa um comando sem usar o token stop-parsing. O PowerShell avalia a cadeia de caracteres entre aspas e passa o valor (sem aspas) para cmd.exe, o que resulta em um erro.
PS> cmd /c echo "a|b"
'b' is not recognized as an internal or external command,
operable program or batch file.
PS> cmd /c --% echo "a|b"
"a|b"
Observação
O token de análise de parada não é necessário ao usar cmdlets do PowerShell. No entanto, pode ser útil passar argumentos para uma função do PowerShell projetada para chamar um comando nativo com esses argumentos.
Passando argumentos que contêm caracteres de aspas
Alguns comandos nativos esperam argumentos que contenham caracteres de aspas. O PowerShell 7.3 alterou a maneira como a linha de comando é analisada para comandos nativos.
Atenção
O novo comportamento é uma alteração de quebra do comportamento do Windows PowerShell 5.1. Isso pode quebrar scripts e automação que contornam os vários problemas ao invocar aplicativos nativos. Use o token de análise de parada (--%) ou o cmdlet Start-Process para evitar que o argumento nativo passe quando necessário.
A nova variável de preferência $PSNativeCommandArgumentPassing controla esse comportamento. Essa variável permite que você selecione o comportamento em tempo de execução. Os valores válidos são Legacy, Standarde Windows. O comportamento padrão é específico da plataforma. Em plataformas Windows, a configuração padrão é Windows e em plataformas não Windows é Standard.
Legacy é o comportamento histórico. O comportamento dos modos Windows e Standard é o mesmo, exceto que, no modo Windows, as invocações dos seguintes ficheiros utilizam automaticamente o método de passagem de argumentos no estilo Legacy.
cmd.execscript.exewscript.exe- terminando com
.bat - terminando com
.cmd - terminando com
.js - terminando com
.vbs - terminando com
.wsf
Se o $PSNativeCommandArgumentPassing estiver definido como Legacy ou Standard, o analisador não verificará esses arquivos.
Observação
Os exemplos a seguir usam a ferramenta TestExe.exe. Você pode criar TestExe a partir do código-fonte. Consulte TestExe no repositório de origem do PowerShell.
Novos comportamentos disponibilizados por esta alteração:
Strings literais ou expansíveis com aspas incorporadas: as aspas agora são preservadas.
PS> $a = 'a" "b' PS> TestExe -echoargs $a 'c" "d' e" "f Arg 0 is <a" "b> Arg 1 is <c" "d> Arg 2 is <e f>Cadeias de caracteres vazias como argumentos agora são preservadas:
PS> TestExe -echoargs '' a b '' Arg 0 is <> Arg 1 is <a> Arg 2 is <b> Arg 3 is <>
O objetivo desses exemplos é passar o caminho do diretório (com espaços e aspas) "C:\Program Files (x86)\Microsoft\" para um comando nativo para que ele receba o caminho como uma cadeia de caracteres entre aspas.
No modo Windows ou Standard, os exemplos a seguir produzem os resultados esperados:
TestExe -echoargs """${env:ProgramFiles(x86)}\Microsoft\"""
TestExe -echoargs '"C:\Program Files (x86)\Microsoft\"'
Para obter os mesmos resultados no modo Legacy, deve escapar das aspas ou utilizar o token de paragem de análise (--%):
TestExe -echoargs """""${env:ProgramFiles(x86)}\Microsoft\\"""""
TestExe -echoargs "\""C:\Program Files (x86)\Microsoft\\"""
TestExe -echoargs --% ""\""C:\Program Files (x86)\Microsoft\\"\"""
TestExe -echoargs --% """C:\Program Files (x86)\Microsoft\\""
TestExe -echoargs --% """%ProgramFiles(x86)%\Microsoft\\""
Observação
O caractere de barra invertida (\) não é reconhecido como um caractere de escape pelo PowerShell. É o caractere de escape usado pela API subjacente para ProcessStartInfo.ArgumentList.
O PowerShell 7.3 também adicionou a capacidade de rastrear a vinculação de parâmetros para comandos nativos. Para obter mais informações, consulte Trace-Command.
Passando argumentos para comandos do PowerShell
A partir do PowerShell 3.0, você pode usar o token de fim de parâmetros
O token de fim de parâmetros
O token de fim de parâmetros (--) indica que todos os argumentos que o seguem devem ser passados em sua forma real como se aspas duplas fossem colocadas em torno deles. Por exemplo, usando -- você pode gerar a saída da cadeia de caracteres -InputObject sem usar aspas ou interpretá-la como um parâmetro:
Write-Output -- -InputObject
-InputObject
Ao contrário do token stop-parsing (--%), quaisquer valores após o token -- podem ser interpretados como expressões pelo PowerShell.
Write-Output -- -InputObject $env:PROCESSOR_ARCHITECTURE
-InputObject
AMD64
Esse comportamento só se aplica a comandos do PowerShell. Se você usar o token -- ao chamar um comando externo, a cadeia de caracteres -- será passada como um argumento para esse comando.
TestExe -echoargs -a -b -- -c
A saída mostra que -- é passado como um argumento para TestExe.
Arg 0 is <-a>
Arg 1 is <-b>
Arg 2 is <-->
Arg 3 is <-c>
Til (~)
O caractere til (~) tem significado específico no PowerShell. Quando é usado com comandos do PowerShell no início de um caminho, o caractere til é expandido para o diretório base do usuário. Se o caractere til for usado em qualquer outro lugar em um caminho, ele será tratado como um caractere literal.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Set-Location ~
PS C:\Users\user2> $PWD
Path
----
C:\Users\user2
Neste exemplo, o Name parâmetro do New-Item espera uma cadeia de caracteres. O caractere til é tratado como um caractere literal. Para alterar para o diretório recém-criado, você deve qualificar o caminho com o caractere til.
PS D:\temp> Set-Location ~
PS C:\Users\user2> New-Item -Type Directory -Name ~
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 5/6/2024 2:08 PM ~
PS C:\Users\user2> Set-Location ~
PS C:\Users\user2> Set-Location .\~
PS C:\Users\user2\~> $PWD
Path
----
C:\Users\user2\~
Quando você usa o caractere til com comandos nativos, o PowerShell passa o til como um caractere literal. Usar o til em um caminho causa erros para comandos nativos no Windows que não suportam o caractere til.
PS D:\temp> $PWD
Path
----
D:\temp
PS D:\temp> Get-Item ~\repocache.clixml
Directory: C:\Users\user2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/29/2024 3:42 PM 88177 repocache.clixml
PS D:\temp> more.com ~\repocache.clixml
Cannot access file D:\temp\~\repocache.clixml