A menos que você use -LiteralPath
, os colchetes causam problemas reais com o escape de caracteres. O problema é que o PowerShell descarta as strings várias vezes internamente e usa caracteres especiais para correspondência de padrões. Obter o PowerShell para reconhecer corretamente um colchete literal em uma string de caminho é complexo.
Se você estiver usando strings de aspas simples, um suporte precisa de dois backticks para escapar. Se você usa strings de aspas duplas, um suporte precisa de quatro backticks para escapar.
Se você está procurando um arquivo chamado MyFile[1].txt
, você precisa usar:
'MyFile''[1''].txt'
ou:
"MyFile''''[1''''].txt"
Sim, é uma dor. Para ver por que isso acontece, você precisa saber o que está acontecendo. É fácil fazer isso trabalhando de trás para frente.
Digamos que você queira obter um arquivo chamado literalmente [ab].txt
.
O padrão de curinga correspondente a Get-ChildItem
significa que, se obtiver [ab].txt
como o caminho, ele procurará arquivos com os nomes a.txt
e b.txt
. Então, se quisermos combinar um literal [ab].txt
, temos que escapar de nossos colchetes com o caractere de escape: o backtick. Isso nos dá isso como a string real de caracteres que queremos que Get-ChildItem
use para o filespec:
'[ab'].txt
No entanto, temos que passar este filespec como uma string. Isso significa que Get-ChildItem
vai escapar desses backticks, mas não é isso que queremos! Nós queremos backticks literais. Então, escapamos dos backticks com backticks em nossa string para garantir que Get-ChildItem
use o filespec correto:
'''[ab''].txt'
Se quisermos usar strings com aspas duplas, então temos que escapar de cada backtick novamente , pois a string de aspas duplas irá remover a string. E é assim que você acaba com isso:
"''''[ab''''].txt"
É por isso que muitas funções do PowerShell que usam filespecs têm a opção -LiteralPath
.