No Unix eu poderia rodar myscript '"test"'
e obter "test"
.
No Windows cmd
eu consigo 'test'
.
Como posso passar aspas duplas como parâmetro? Gostaria de saber como fazer isso manualmente em uma cmd
janela para não ter que escrever um programa para testar meu programa.
myscript \"test\"
Respostas:
Não consigo reproduzir rapidamente os sintomas: se eu tentar
myscript '"test"'
com um arquivo em lotemyscript.bat
contendo apenas@echo.%1
ou uniforme@echo.%~1
, obtenho todas as cotações:'"test"'
Talvez você possa tentar o caractere de escape
^
assimmyscript '^"test^"'
:?fonte
wscript
culpa! Deixe para o Windows :)cmd
.Outra maneira de escapar das aspas (embora provavelmente não seja preferível), que descobri ser usada em certos lugares, é usar várias aspas duplas . Com o propósito de tornar o código de outras pessoas legível, vou explicar.
Aqui está um conjunto de regras básicas:
program param1 param2 param 3
vai passar quatro parâmetros paraprogram.exe
:param1
,param2
,param
, e3
.program one two "three and more"
vai passar três parâmetros paraprogram.exe
:one
,two
ethree and more
.hello"to the entire"world
atua como um parâmetro:helloto the entireworld
."Tim says, ""Hi!"""
atuará como um parâmetro:Tim says, "Hi!"
Portanto, existem três tipos diferentes de aspas duplas: aspas que abrem, aspas que fecham e aspas que funcionam como texto simples.
Aqui está o detalhamento dessa última linha confusa:
Assim, o texto efetivamente junta quatro grupos de caracteres (um sem nada, no entanto):
Tim says,
é o primeiro, embrulhado para escapar dos espaços"Hi!
é o segundo, não embrulhado (não há espaços)é o terceiro, um grupo de aspas duplas que não envolve nada
"
é o quarto, a citação final não embaladaComo você pode ver, o grupo de aspas duplas não envolve nada ainda é necessário, pois, sem ele, as aspas duplas a seguir abririam um grupo de aspas duplas em vez de atuar como texto simples.
A partir disso, deve ser reconhecível que, portanto, as aspas internas e externas, três aspas duplas funcionam como aspas duplas sem escape de texto simples:
será impresso
Tim said to him, "What's been happening lately?"
conforme o esperado. Portanto, três aspas sempre podem ser usadas de forma confiável como um escape.No entanto, ao compreendê-lo, você pode notar que as quatro aspas no final podem ser reduzidas a meras duas, visto que tecnicamente está adicionando outro grupo vazio de aspas duplas desnecessário.
Aqui estão alguns exemplos para fechá-lo:
Nota final: eu não li nada disso em nenhum tutorial - eu vim com tudo isso experimentando. Portanto, minha explicação pode não ser verdadeira internamente. No entanto, todos os exemplos acima são avaliados como dados, validando (mas não provando) minha teoria.
Eu testei isso no Windows 7 de 64 bits usando apenas chamadas * .exe com passagem de parâmetro (não * .bat, mas suponho que funcione da mesma forma).
fonte
Experimente isto:
"" escape para um único "no parâmetro.
fonte
myscript """test test"""
e não funciona (o primeiro parâmetro é entregue como"test
. Na verdade, você precisa de três aspas:myscript """"test test""
A terceira citação no final pode ser ignorada, no entanto.char **argv
do meu iniciador C para outro processo usando funções comospawn
ouexec
. Obrigado. :-)O segundo documento citado por Peter Mortensen em seu comentário sobre a resposta de Codesmith deixou as coisas muito mais claras para mim. Esse documento foi escrito por windowsinspired.com. O link se repetia: Uma maneira melhor de entender como citar e escapar de argumentos de linha de comando do Windows .
Algumas outras tentativas e erros levam à seguinte diretriz:
Fuja de todas as aspas duplas
"
com um circunflexo^
. Se você quiser outros caracteres com significado especial para o shell de comando do Windows (por exemplo,<
,>
,|
,&
) deve ser interpretado como personagens regulares em vez disso, em seguida, fugir-los com um acento circunflexo, também.Se você deseja que seu programa foo receba o texto da linha de comando
"a\"b c" > d
e redirecione sua saída para o arquivo out.txt , inicie seu programa da seguinte maneira no shell de comando do Windows:Se foo interpretar
\"
como aspas duplas literal e esperar aspas duplas sem escape para delimitar argumentos que incluem espaços em branco, então foo interpretará o comando como especificando um argumentoa"b c
, um argumento>
e um argumentod
.Se, em vez disso, foo interpretar aspas duplas
""
como aspas literais, inicie o seu programa comoA principal ideia do documento citado é que, para o shell de comando do Windows, uma aspa dupla sem escape aciona a alternância entre dois estados possíveis.
Algumas outras tentativas e erros implicam que, no estado inicial, o redirecionamento (para um arquivo ou canal) é reconhecido e um acento circunflexo
^
escapa de uma aspa dupla e o acento circunflexo é removido da entrada. No outro estado, o redirecionamento não é reconhecido e um acento circunflexo não escapa a uma aspa dupla e não é removido. Vamos nos referir a esses estados como 'fora' e 'dentro', respectivamente.Se você quiser redirecionar a saída de seu comando, o shell de comando deve estar no estado externo quando atingir o redirecionamento, portanto, deve haver um número par de aspas duplas sem escape (por circunflexo) antes do redirecionamento.
foo "a\"b " > out.txt
não funcionará - o shell de comando passa tudo"a\"b " > out.txt
para foo como seus argumentos de linha de comando combinados, em vez de passar apenas"a\"b "
e redirecionar a saída para out.txt .foo "a\^"b " > out.txt
não funcionará, também, porque o acento circunflexo^
é encontrado no estado interno onde é um caractere comum e não um caractere de escape, então"a\^"b " > out.txt
é passado para foo .A única maneira que (felizmente) sempre funciona é manter o shell de comando sempre no estado externo, porque então o redirecionamento funciona.
Se você não precisa de redirecionamento (ou outros caracteres com significado especial para o shell de comando), você pode fazer sem os circunflexos. Se foo interpretar
\"
como uma aspa dupla literal, você pode chamá-lo deEm seguida, foo recebe
"a\"b c"
como seu texto de argumentos combinados e pode interpretá-lo como um único argumento igual aa"b c
.Agora - finalmente - à pergunta original.
myscript '"test"'
chamado do shell de comando do Windows passa'"test"'
para myscript . Aparentemente, o myscript interpreta as aspas simples e duplas como delimitadores de argumento e as remove. Você precisa descobrir o que myscript aceita como aspas duplas literais e, em seguida, especificar isso em seu comando, usando^
para escapar quaisquer caracteres que tenham um significado especial para o shell de comando do Windows. Dado quemyscript
também está disponível no Unix, talvez\"
funcione. Experimentarou, se você não precisa de redirecionamento,
fonte
Estou chamando o PowerShell do cmd, e passar aspas e nenhum escape aqui funcionou. O sotaque grave funcionou para escapar das aspas duplas neste Win 10 Surface Pro.
Abaixo estão as saídas que obtive de outros caracteres para escapar de aspas duplas:
Usar outra citação para escapar de uma citação resultou em nenhuma citação. Como você pode ver, os próprios caracteres foram digitados, mas não escaparam das aspas duplas.
fonte