2011-05-04 12:54:50 +0000 2011-05-04 12:54:50 +0000
92
92
Advertisement

Come faccio a sfuggire agli spazi nella riga di comando di Windows senza usare le virgolette?

Advertisement

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

CD "c:\Documents and Settings"
``` ```
SVN add mypathname\*.*

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

SVN add "mypathname\*.*"

ma questo comando NON funziona :

SVN add "c:\Documents and Settings\username\svn\*.*"
``` ```
svn: warning: 'c:\Documents and Settings\username\svn\*.*' not found

Il problema è che quando cambio mypathname per un percorso con spazi in esso ho bisogno di citare il tutto. Per esempio:

&001 &001

Ma quando provo a farlo ottengo il seguente messaggio di errore:

&001

Advertisement

Risposte (7)

59
59
59
2011-05-04 16:59:54 +0000

Per me funziona quasi tutto, ma avete forse provato la linea 5… che sfugge allo spazio con il simbolo del caret (^)

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 per esempio sotto dove il caret fa davvero la differenza.

Sembra dal basso come se il simbolo del caret fosse la vostra risposta, vedere la linea 3 qui sotto.

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:\>
36
36
36
2013-04-24 07:45:18 +0000

Ho scoperto che mettere le virgolette intorno a una sola parte della location funziona. Nel vostro caso:

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


Anche se questo usa le virgolette, la cosa importante da notare è che gli asterischi sono _al di fuori_ delle virgolette, quindi funzionano ancora correttamente.
26
Advertisement
26
26
2015-08-26 02:01:44 +0000

Nonostante le risposte diano l'illusione che funzioni, il fatto è che non è possibile intrufolarsi negli spazi per i soliti argomenti cmd. Questo è facile da dimostrare:

  1. Salvare “echo %1” come test.bat. Questo file batch visualizzerà il primo argomento che cmd ci passa.

  2. Salva “test.bat” come %1. Ora, provate ad eseguire foo bar, impostando il valore di foo su bar. (Notare che c'è un carattere di spazio tra ^ e test.bat foo^ bar)

    1. Provare e sbagliare per qualche anno e rendersi conto che non c'è modo di farlo. La gente suggerirà di fuggire usando foo bar, ma foo bar non emetterà test.bat foo" "bar.

Quindi, non c'è modo di ottenere l'uscita foo" "bar, e il più vicino che possiamo ottenere è l'esecuzione di test.bat "foo bar" che produce "foo bar", o l'esecuzione di cd che produce %1.


Ora, la ragione per cui le altre risposte appaiono funzionare è perché %2 fa il proprio parsing addizionale, divergente dal comportamento del solito argomento che passa (il solito %3, cd, c:\documents, and ed ecc. nei tipici file batch).

Per esempio, si consideri il comando peculiare:

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

Perché funziona? Ciò è dovuto al fatto che settings se stesso fa qualcosa di equivalente a unire i 7 argomenti _usuali in uno logico. Secondo l'argomento cmd che passa norme, vediamo 7 argomenti:

  1. \some
  2. folder
  3. with
  4. spaces
  5. cd
  6. array.join(" ")
  7. cd
  8. cd
  9. foo bar
  10. È come se foo" "bar avesse unito tutti i 7 argomenti in uno logico, facendo qualcosa di simile a "foo bar", che produce il percorso:
c:\documents and settings \some folder with spaces

Si noti che questo comportamento è peculiare solo a "foo "bar (e alcune altre funzioni). Non ha nulla a che vedere con il solito passaggio di argomenti.


Infatti, foo" bar" ha un'altra particolarità. Ricordate che abbiamo detto sopra che non siamo riusciti ad ottenere l'uscita "foo b"ar? L'uscita più vicina che possiamo ottenere è:

test.bat foo" "bar

che produce fo"o bar", oppure:

test.bat "foo bar"
``` ```
test.bat "foo "bar

che produce fo"o ba"r, oppure:

test.bat foo" bar"
``` ```
test.bat "foo b"ar

che produce "fo"o" bar", oppure:

test.bat fo"o bar"
``` ```
test.bat fo"o ba"r

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

test.bat "fo"o" bar"

che produce """"f"""o""""o"" ""ba"""r"""""""""", oppure:

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

che produce foo bar, oppure:

&001 &001

che produce ", oppure:

&001 &001

che produce cd, oppure:

&001

che produce cd, oppure:

&001

che produce ".

Tutti gli esempi di cui sopra hanno una somiglianza, ovvero che produrranno cd c:\documents and settings dopo che avremo tagliato i caratteri di cd "c:\documents and settings". L'autore di cd "c:"\"documents and settings" deve essersi reso conto anche di questo… se dovessimo dedurre dal comportamento peculiare di cd c:\"documents" "and" "settings" che taglia tutti i cd c:\"docu"ments an"d set"tings" che riceve , permettendo a tutti questi comandi di funzionare:

  • 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

  • &007

  • &007

  • &007

  • &007

  • &007

8
8
8
2014-04-19 07:51:15 +0000

Il nome del corto sembra funzionare come un gioco da ragazzi.

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

Per aumentare la memoria… ;)

3
Advertisement
3
3
2012-10-03 14:47:56 +0000

Utilizzare il nome a breve termine 8.3. Per esempio:

If exist c:\docume~1 goto :Ifoundthesucker
2
2
2
2017-05-12 08:43:24 +0000

Per chi parla di sostituzione della 8.3, si prega di notare le seguenti due cose:

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

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

  • Nowhere (non valido)
  • La cartella che si desidera
  • 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.

Anche se è molto raro che cambino, è comune che non esistano.

Se volete sapere se la 8.3 esiste per una particolare cartella/file, testatela con il parametro /X su un comando dir, o incapsulatela su un for per ottenere solo quella parte, ecc.

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

0
Advertisement
0
0
2019-08-08 20:42:46 +0000

Seguendo il post di @Pang, e altri che parlano di nomi brevi e delle insidie, ecco come risolvere dinamicamente un nome lungo con un nome corto:

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

Poi, ovviamente, si può usare il nome corto piuttosto che le virgolette circostanti.

Advertisement
Advertisement