Domanda

In un file batch di Windows, quando si esegue il seguente:

  

set myvar="c:\my music & videos"

il myvar variabile viene memorizzata con le virgolette inclusi. Onestamente trovo che molto stupido. Le virgolette sono solo dire dove la stringa inizia e finisce, per non essere memorizzati come parte del valore stesso.
Come posso evitare che ciò accada?

Grazie.

È stato utile?

Soluzione

set "myvar=c:\my music & videos"

Si noti le quotazioni iniziano prima di myvar. In realtà è così semplice. Nota a margine:. myvar non può essere eco in seguito a meno che è avvolto tra virgolette perché e verrà letto come un separatore di comando, ma sarà ancora lavorare come un percorso

http://ss64.com/nt/set.html sotto "nomi variabile può includere spazi "

Altri suggerimenti

Questo è il modo corretto per farlo:

set "myvar=c:\my music & videos"

Le citazioni non saranno inclusi nel valore della variabile.

Dipende da come si desidera utilizzare la variabile. Se si desidera utilizzare il valore della variabile senza le virgolette è possibile utilizzare sia l'espansione in ritardo e sostituzione di stringhe, o il comando for:

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

Come andynormancx Stati, le virgolette sono necessarie dal momento che la stringa contiene la &. Oppure si può scappare con la ^, ma penso che le virgolette sono un po 'più pulito.

Se si utilizza l'espansione ritardata con la sostituzione di stringhe, si ottiene il valore della variabile senza le virgolette:

@echo !myvar:"=!
>>> C:\my music & videos

È anche possibile utilizzare il comando for:

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

Tuttavia, se si desidera utilizzare la variabile in un comando, è necessario utilizzare il valore riportato o racchiudere il valore della variabile tra virgolette:

  1. Usare la sostituzione di stringa e l'espansione ritardata per utilizzare il valore della variabile senza virgolette, ma utilizzare la variabile in un comando:

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. L'utilizzo del comando for di utilizzare il valore della variabile senza virgolette, ma si dovrà circondare la variabile con le virgolette quando viene utilizzato in comandi:

    @echo OFF
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

Per farla breve, non c'è davvero nessun modo pulito per utilizzare un percorso o il nome del file che contiene spazi e / o &s incorporati in un file batch.

Utilizzare JScript.

Molte lune fa (cioè circa 8 anni più o meno) stavo lavorando a un grande progetto di C ++ / VB6, e ho avuto vari pezzi di batch script per fare le parti della costruzione.

Poi qualcuno mi ha segnalato alla Joel prova , ero particolarmente innamorato del punto 2 , e impostare di portare tutti i miei piccoli script di build in uno script di sola costruzione. . .

ed è quasi spezzato il cuore, ottenendo tutti quei piccoli script che lavorano insieme, su macchine diverse, con leggermente diverse configurazioni, dei del YE 'stato terribile - variabili particolare impostazione e passaggio di parametri. E 'stato davvero fragile, la minima cosa sarebbe romperlo e richiedono 30 minuti di tweaking per andare avanti di nuovo.

Alla fine - posso essere me testarda - Ho buttato l'intera partita e in circa un giorno ri-scritto tutto in JavaScript , eseguirlo dal prompt dei comandi con CScript.

Non ho guardato indietro. Anche se in questi giorni è MSBuild e il Cruise Control, se ho bisogno di fare qualcosa di ancora un po 'coinvolto con uno script batch, io uso JScript.

L'interprete dei comandi di Windows consente di utilizzare le virgolette intorno l'intero comando set (valido in ogni versione di Windows NT da NT 4.0 a Windows 2012 R2)

Lo script deve solo essere scritto come segue:

@echo OFF

set "myvar=C:\my music & videos"

Poi si può mettere tra virgolette le variabili a seconda delle necessità.

Lavorare con il prompt CMD può sembrare esoterico a volte, ma l'interprete dei comandi in realtà si comporta abbastanza solidamente nell'obbedire è logica interna, è solo bisogno di ri-pensare le cose.

In realtà, il comando set non richiede di usare le virgolette a tutti, ma sia il modo in cui si sta facendo la vostra assegnazione variabile e il modo in cui, metodo di utilizzo senza virgolette può causare di avere spazi aggiuntivi intorno alla vostra variabile che sono difficili da notare quando il debug dello script.

es. Entrambi Il sotto sono tecnicamente valido, ma si può avere gli spazi finali, quindi non è una buona pratica:

set myvar=some text   
set myvar="some text" 

es. Entrambi i sottostanti sono buoni metodi per impostare le variabili in comandi di Windows interprete, ma il metodo della partita doppia citazione è superiore:

set "myvar=Some text"
(set myvar=Some value)

Entrambi questi non lasciano nulla all'interpretazione la variabile avrà esattamente i dati che si sta cercando.

forte di testo Tuttavia, per i vostri scopi, solo il metodo citato funzionerà validamente perché si sta utilizzando un carattere riservato

In questo modo, si può usare:

set myvar="c:\my music & videos"

Tuttavia, anche se la variabile sia impostata correttamente a questa stringa, quando si fanno eco il pungiglione l'interprete dei comandi interpreterà la e commerciale, come la parola per indicare un'altra affermazione segue.

Quindi, se si vuole eco la stringa dalla variabile ha ancora bisogno l'interprete CMD ci hanno detto che è una stringa di testo, o se non si desidera che le citazioni per mostrare quello che dovete fare una delle seguenti opzioni:

eco la variabile con Citazioni:

Echo."%myvar%"

echo la variabile senza virgolette:

Echo.%myvar:&=^&%
<nul SET /P="%myvar%"

In queste due scenari è possibile eco la stringa con senza virgolette bene. Uscita seguente esempio:

C:\Admin>    Echo.%myvar:&=^&%
C:\my music & videos

C:\Admin>    <nul SET /P="%myvar%"
C:\my music & videos
C:\Admin>

Provare a utilizzare il carattere di escape '^', per esempio.

set myvar=c:\my music ^& videos

Dovrete stare attenti quando si espande myvar perché la shell non potrebbe trattare il & come letterale. Se quanto sopra non funziona, provare ad inserire un accento circonflesso nella stringa troppo:

set myvar=c:\my music ^^^& videos

deve avere le virgolette se il testo che si sta impostando include alcuni personaggi, tra cui & . Se il testo non include & , quindi non avrebbe bisogno le virgolette.

Per esempio, se il testo fosse solo "C: \ mia musica", allora si potrebbe fare:

set myvar = c:\my music

Ma perché il testo ha un & è necessario le virgolette.

Modifica

O, come dice Dave nella sua risposta si può sfuggire i caratteri problematici con ^^^ , ma attenzione a questo approccio come & non è l'unico personaggio è necessario scappare. In pratica è molto più facile da attaccare con le virgolette, piuttosto che fuggire tutti i personaggi del problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top