Come posso evitare gli spazi nella riga di comando in Windows senza usare le virgolette?


88

Ad esempio qual è l'alternativa a questo comando senza virgolette:

CD "c:\Documents and Settings"

Il motivo completo per cui non voglio usare le virgolette è che questo comando FUNZIONA:

   SVN add mypathname\*.*

ma questo comando NON funziona:

   SVN add "mypathname\*.*"

Il problema è che quando cambio mypathname per un percorso con spazi dentro devo citare il tutto. Per esempio:

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

Ma quando provo questo ottengo il seguente messaggio di errore:

svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

2
intendevi dire che hai una buona ragione per "non" voler usare le virgolette.
Thomas,

Perché la chiave delle virgolette è rotta? :)
slhck,

3
@slhck Non preoccuparti, il tasto shift e il tasto numero 2 sono perfettamente a posto! Sto usando un comando che non sembra consentire i caratteri jolly quando compaiono tra virgolette, tutto qui!
David,

1
@MarkBooth e @WeltenWanderer bel tentativo ma purtroppo non funziona. In tutti e 3 i casi ottengo un "svn: errore nella risoluzione del caso di ....."
David,

1
Hai provato la vecchia formattazione 8.3 del nome (DOCUME ~ 1)?
Justin Pearce,

Risposte:


55

Funziona quasi tutto per me, ma hai forse provato la linea 5 .. sfuggire allo spazio con il simbolo di un cursore (^)

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:\>

O ad es. Sotto, dove il cursore fa davvero la differenza.

Sembra dal basso come il simbolo del cursore potrebbe essere la tua risposta, vedere la riga 3 di seguito.

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:\>

poiché la sovversione è uno strumento di programmazione, potrebbe essere appropriato per SO. ecco una domanda correlata stackoverflow.com/questions/757435/… potrebbe essere che tu usi virgolette o cursore per farlo svn, quindi forse usi la barra rovesciata prima di ogni spazio
barlop

potresti anche provare lo svn di cygwin, se curioso ... con alcune delle risposte di esempio in quella domanda e vedere se alcune o varianti di esse funzionano per te.
barlop

5
Il simbolo del cursore risponde direttamente alla mia domanda, quindi accetterò la tua risposta. Sfortunatamente il comando SVN non sembra riconoscerlo! Se lo provo ricevo questo messaggio di errore "svn 'C:' non è una copia funzionante". Ho un altro modo per aggirarlo, e cioè semplicemente "cd" nella directory prima, quindi eseguire il comando SVN una volta lì. Posso persino concatenare i due comandi in un'unica riga usando l'operatore &&: cd "c: \ Documents and Settings \ nomeutente \ svn" && SVN add *. *
David

nell'esempio del CD, il cursore non è necessario, il CD non ha bisogno di spazio di escape
barlop

1
@ Chinggis6 interessante .. non funziona neanche per DIR. Sia copy che dir sono incorporati nei comandi .. anche se lo è anche il CD. Tuttavia, copy e dir prendono un nome file come parametro. Potrebbe valere la pena chiedere sul forum
dostips

35

Ho scoperto che mettere le virgolette solo su una parte della posizione funziona. Nel tuo caso:

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

Sebbene utilizzi le virgolette, la cosa importante da notare è che gli asterischi sono fuori dalle virgolette, quindi funzionano ancora correttamente.


7
anche se si vuole essere minimalisti, si possono fare virgolette solo intorno allo spazio o solo i caratteri che contengono lo spazio, ad esempio C: \> cd documenti "e se" ttings (anche se per quel cd esempio, non è necessario scappare spazi)
barlop

1
Molte grazie. Potrei aver votato 4 o 5 volte se possibile ..
Sayka,

@Sayka La domanda si è posta "Come posso sfuggire agli spazi nella riga di comando in Windows senza usare le virgolette? "
barlop

2
@barlop Certo, ma la ragione per cui non ci sono virgolette è che l'asterisco non fa il suo lavoro quando è racchiuso tra virgolette. La soluzione che ho dato evita questo problema perché gli asterischi sono fuori dalle virgolette. Questa risposta non rispetta la lettera della domanda, ma rispetta lo spirito della domanda (vale a dire, funziona per lo scopo previsto).
Kit Johnson,

26

Nonostante le risposte diano l'illusione che funzioni, il fatto è che non puoi intrufolarti negli spazi nei soliti argomenti cmd. Questo è facile da dimostrare:

  1. Salva " echo %1" come test.bat. Questo file batch genererà il primo argomento che cmd ci passa.

  2. Ora, prova ad eseguire test.bat, impostando il valore di %1a foo bar. (Nota che c'è un carattere spaziale tra fooe bar.)

  3. Prova ed errore per alcuni anni e rendersi conto che non c'è modo di farlo . La gente suggerirà di scappare usando ^, ma test.bat foo^ barnon produrrà foo bar.

Quindi, non c'è modo di ottenere l'output foo bare il più vicino che possiamo ottenere è in esecuzione test.bat foo" "barche produce foo" "baro in esecuzione test.bat "foo bar"che produce "foo bar".


Ora, la ragione per le altre risposte sembrano al lavoro è perché cdfa il proprio analisi supplementari, divergendo dal comportamento di solito argomento che passa (il solito %1, %2, %3ed ecc in file tipici lotti).

Ad esempio, considera il comando peculiare:

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

Perché funziona Ciò è dovuto alla cd stessa di fare qualcosa di equivalente di unire le 7 soliti argomenti in una sola logica. Secondo l'argomento cmd che passa le norme, vediamo 7 argomenti:

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

È come se cdavesse unito tutti i 7 argomenti in uno logico, facendo qualcosa di simile array.join(" "), che produce il percorso:

c:\documents and settings \some folder with spaces

Si noti che questo comportamento è peculiare cdsolo (e alcune altre funzioni). Non ha nulla a che fare con il solito passaggio di argomenti.


Anzi, cdha un'altra peculiarità. Ricordi che abbiamo affermato sopra che non siamo riusciti a ottenere l'output foo bar? L'output più vicino che possiamo ottenere è eseguendo:

test.bat foo" "bar

che produce foo" "baro:

test.bat "foo bar"

che produce "foo bar"o:

test.bat "foo "bar

che produce "foo "baro:

test.bat foo" bar"

che produce foo" bar"o:

test.bat "foo b"ar

che produce "foo b"aro:

test.bat fo"o bar"

che produce fo"o bar"o:

test.bat fo"o ba"r

che produce fo"o ba"ro:

test.bat "fo"o" bar"

che produce "fo"o" bar"o:

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

che produce "f""o""o"" ""b""a""r", o addirittura:

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

che produce """"f"""o""""o"" ""ba"""r"""""""""".

Tutti gli esempi sopra hanno una somiglianza, che è che produrranno foo bardopo aver tagliato i "caratteri. cdL'autore deve aver capito anche questo ... se dovessimo dedurre dal cdcomportamento peculiare che taglia tutto "ciò che riceve , permettendo a tutti questi comandi di funzionare:

  • 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


15
Che pasticcio programmazione batch di Windows ...
Klangen

Grazie. Possiamo determinare se il CD sta usando argv[]o GetCommandLine()? pastebin.com/raw/t55iv0JS
barlop

7

Il nome breve del file sembra funzionare come un gioco da ragazzi.

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

Per aumentare la memoria ..;)


8
potrebbe non funzionare se il nome breve del file è stato disabilitato
phuclv,


2

Per coloro che parlano della sostituzione 8.3, tenere presente quanto segue:

  • 8.3 può essere impostato su disabilitato (o abilitato) su NTFS, quindi potrebbe non esistere sempre.
  • Il nome 8.3 di un file / cartella può cambiare senza preavviso semplicemente creando, rinominando o eliminando altre cose nella stessa cartella.

Quindi c:\docume~1può puntare a:

  • Nowhere (essere non valido)
  • La cartella che desideri
  • Un'altra cartella
  • Una cartella variabile nel tempo

Non è sicuro, a meno che non si ottenga il nome breve e lo si usi nelle operazioni atomiche.

Sebbene sia molto raro che cambino, è comune che non esistano.

Se vuoi sapere se 8.3 esiste per una particolare cartella / file, testalo con il parametro /Xsu un dircomando o incapsulalo su a forper ottenere solo quella parte, ecc.

Per ulteriori informazioni su come abilitare / disabilitare 8.3 su NTFS, consultare questo articolo di supporto Microsoft:
https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name- ntfs-partizioni creazione-on-


0

Seguendo il post di @ Pang e altri discutendo di nomi brevi e insidie, ecco il modo di risolvere dinamicamente un nome lungo in un nome breve:

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

Quindi, ovviamente, puoi usare il nome breve anziché le virgolette circostanti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.