Como escapar de espaços na linha de comando no Windows sem usar aspas?

88

Por exemplo, qual é a alternativa para este comando sem aspas:

CD "c:\Documents and Settings"

O motivo completo pelo qual não quero usar aspas é que esse comando funciona:

   SVN add mypathname\*.*

mas este comando NÃO funciona:

   SVN add "mypathname\*.*"

O problema é que, quando troco meu nome do caminho por um caminho com espaços, preciso citar a coisa toda. Por exemplo:

SVN add "c:\Documents and Settings\username\svn\*.*"

Mas quando eu tento isso, recebo a seguinte mensagem de erro:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found
David
fonte
2
você quis dizer que tem um bom motivo para 'não' querer usar aspas.
6115 Thomas
Por que, sua chave de cotação está quebrada? :)
slhck
3
@slhck Não se preocupe, minha tecla Shift e a tecla número 2 estão perfeitamente bem! Estou usando um comando que parece não permitir caracteres curinga quando aparecem entre aspas, isso é tudo!
David
1
@MarkBooth e @WeltenWanderer boa tentativa, mas infelizmente isso não funciona. Nos três casos, recebo um "svn: Erro ao resolver caso de ....."
David
1
Você já tentou a formatação 8.3 antiga do nome (DOCUME ~ 1)?
Justin Pearce

Respostas:

55

Quase tudo funciona para mim, mas você já tentou a linha5 .. escapando do espaço com um símbolo de sinal de intercalação (^)

1 C:\Documents and Settings\user>cd ..

2 C:\Documents and Settings>cd ..

3 C:\>cd Documents and Settings

4 C:\Documents and Settings>cd..

5 C:\>cd Documents^ and^ Settings

6 C:\Documents and Settings>cd..

7 C:\>cd C:\documents and settings

8 C:\Documents and Settings>cd..

9 C:\>

Ou, por exemplo, abaixo, onde o cursor realmente faz toda a diferença.

Parece de baixo como o símbolo de sinal de intercalação pode ser sua resposta, consulte a linha 3 abaixo.

1 C:\>"c:\Documents and Settings\a.bat"
gaga

2 C:\>c:\Documents and Settings\a.bat
'c:\Documents' is not recognized as an internal or external command,
operable program or batch file.

3 C:\>c:\Documents^ and^ Settings\a.bat
gaga

C:\>
barlop
fonte
como o subversion é uma ferramenta do programador, pode ser apropriado para o SO. aqui é uma questão relacionada stackoverflow.com/questions/757435/... que poderia ser você usar aspas ou acento circunflexo para obtê-lo para o SVN, então talvez você usa barra invertida antes de cada espaço
barlop
você também pode tentar o svn do cygwin, se curioso .. com algumas das respostas de exemplo nessa pergunta e ver se alguma ou variações delas funcionam para você.
Barlop 5/05
5
O símbolo de sinal de intercalação responde diretamente à minha pergunta, então eu aceito sua resposta. Infelizmente, o comando SVN parece não reconhecê-lo! Se eu tentar, recebo a mensagem de erro "svn 'C:' não é uma cópia de trabalho". Eu tenho outra maneira de contornar isso e isso é simplesmente 'cd' para o diretório primeiro e depois executar o comando SVN uma vez lá. Posso até acorrentar os dois comandos juntos em uma única linha usando o operador &&: cd "c: \ Documents and Settings \ username \ svn" && SVN adicionar * *.
David
no exemplo CD, acento circunflexo não é necessário, CD não precisa de espaço escapou
barlop
1
@ Chinggis6 interessante .. não funciona para DIR também. Copiar e dir são construídos em comandos .. embora o CD também. Embora copy e dir tomem um nome de arquivo como parâmetro. Pode valer a pena perguntar sobre dostips fórum
barlop
35

Descobri que colocar aspas em apenas uma parte do local funciona. No seu caso:

SVN add C:\"Documents and Settings"\username\svn\*.*

Embora isso use aspas, o importante a ser observado é que os asteriscos estão fora das aspas, portanto ainda funcionam corretamente.

Kit Johnson
fonte
7
Além disso, se alguém quiser ser minimalista, pode fazer citações em torno do espaço ou apenas os caracteres que contêm o espaço, por exemplo, C: \> cd documenta "e se" configurações (embora seja esse exemplo do CD, não é necessário escapar )
barlop
1
Muito obrigado. Eu poderia ter upvoted 4 ou 5 vezes, se possível ..
Sayka
@Sayka A pergunta fez perguntar: "Como faço para escapar espaços na linha de comando no Windows sem usar aspas? "
barlop
2
@ Barlop Claro, mas o motivo para não usar aspas é que o asterisco não faz seu trabalho quando está entre aspas. A solução que eu dei evita esse problema porque os asteriscos estão fora das aspas. Esta resposta não cumpre a letra da pergunta, mas cumpre o espírito da pergunta (ou seja, funciona para o propósito pretendido).
Kit Johnson
26

Apesar das respostas que dão a ilusão de que funciona, o fato é que você não pode se infiltrar nos espaços nos argumentos usuais do cmd. É fácil provar:

  1. Salvar " echo %1" como test.bat. Este arquivo em lotes produzirá o primeiro argumento que o cmd nos passa.

  2. Agora, tente executar test.bat, definindo o valor de %1para foo bar. (Observe que há um caractere de espaço entre fooe bar.)

  3. Tente e tente por alguns anos e perceba que não há como fazê-lo . As pessoas sugerem que você evite usar ^, mas test.bat foo^ barnão produzirá foo bar.

Portanto, não há como obter a saída foo bar, e o mais próximo que podemos chegar é executando o test.bat foo" "barque produz foo" "barou executando o test.bat "foo bar"que produz "foo bar".


Agora, a razão as outras respostas aparecem para trabalhar é porque cdfaz a sua própria análise adicional, divergindo do comportamento de argumento usual de passagem (o habitual %1, %2, %3e etc em arquivos em lote típicos).

Por exemplo, considere o comando peculiar:

cd c:\documents and settings \some folder with spaces

Por que isso funciona? Isso se deve ao fato de cd ele fazer algo equivalente a unir os 7 argumentos usuais em um argumento lógico. De acordo com o cmd que passa normas, vemos 7 argumentos:

  1. c:\documents
  2. and
  3. settings
  4. \some
  5. folder
  6. with
  7. spaces

É como se cdjuntasse todos os 7 argumentos em um argumento lógico, fazendo algo parecido com o array.join(" ")que produz o caminho:

c:\documents and settings \some folder with spaces

Observe que esse comportamento é peculiar cdapenas (e algumas outras funções). Não tem nada a ver com a passagem usual de argumentos.


De fato, cdtem outra peculiaridade. Lembre-se de que afirmamos acima que não conseguimos obter a saída foo bar? A saída mais próxima que podemos obter é executando:

test.bat foo" "bar

que produz foo" "bar, ou:

test.bat "foo bar"

que produz "foo bar", ou:

test.bat "foo "bar

que produz "foo "bar, ou:

test.bat foo" bar"

que produz foo" bar", ou:

test.bat "foo b"ar

que produz "foo b"ar, ou:

test.bat fo"o bar"

que produz fo"o bar", ou:

test.bat fo"o ba"r

que produz fo"o ba"r, ou:

test.bat "fo"o" bar"

que produz "fo"o" bar", ou:

test.bat "f""o""o"" ""b""a""r":

que produz "f""o""o"" ""b""a""r", ou até:

test.bat """"f"""o""""o"" ""ba"""r"""""""""":

que produz """"f"""o""""o"" ""ba"""r"""""""""".

Todos os exemplos acima têm uma semelhança: eles produzirão foo bardepois que apararmos os "caracteres. cdO autor de deve ter percebido isso também ... se deduzíssemos do cdcomportamento peculiar de que apara tudo o "que recebe , permitindo que todos esses comandos funcionem:

  • cd c:\documents and settings

  • cd "c:\documents and settings"

  • cd "c:"\"documents and settings"

  • cd c:\"documents" "and" "settings"

  • cd c:\"docu"ments an"d set"tings"

  • cd c:"\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"docu"ments an"d set"ti"""ngs

  • cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs

  • cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs

Pacerier
fonte
15
Que confusão programação janelas lote ...
Klangen
Obrigado. Podemos determinar se o CD está usando argv[]ou GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop
7

O nome do arquivo curto parece funcionar como uma brisa.

"E: \ Progra ~ 1 \ Java \ Eclipse \ eclipse.exe" -vmargs -Xms1024m -Xmx2048m

Por aumentar a memória ..;)

Milorulez
fonte
8
pode não funcionar se o nome do arquivo curto tiver sido desativado
phuclv
3

Use o nome curto de arquivo 8.3. Por exemplo:

If exist c:\docume~1 goto :Ifoundthesucker
Andrew DeMerchant
fonte
Veja o comentário de Lưu Vĩnh Phúc na resposta de Milorulez .
precisa saber é o seguinte
2

Para aqueles que falam sobre a substituição 8.3, observe as duas coisas a seguir:

  • 8.3 pode ser definido como desabilitado (ou habilitado) no NTFS, portanto nem sempre existe.
  • O nome 8.3 de um arquivo / pasta pode mudar sem aviso prévio apenas criando, renomeando ou excluindo outras coisas na mesma pasta.

Então, c:\docume~1pode apontar para:

  • Em nenhum lugar (ser inválido)
  • A pasta que você deseja
  • Outra pasta
  • Uma pasta variável ao longo do tempo

Não é seguro, a menos que você obtenha o nome abreviado e o use em operações atômicas.

Embora seja muito incomum que eles mudem, é comum que eles não existam.

Se você deseja saber se o 8.3 existe para uma pasta / arquivo específico, teste-o com o parâmetro /Xem um dircomando ou encapsule-o forpara obter apenas essa parte, etc.

Para obter mais informações sobre como habilitar / desabilitar a 8.3 no NTFS, consulte este artigo de suporte da Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- criação em partições NTFS

Claudio
fonte
0

Seguindo a postagem de @ Pang e outros discutindo nomes curtos e as armadilhas, aqui está uma maneira de resolver dinamicamente um nome longo para um nome curto:

for %A in ("C:\Some\long path\which must exist\to be resolved") do @echo %~sA

Então, obviamente, você pode usar o nome abreviado em vez das aspas circundantes.

BuvinJ
fonte