Ho un file batch che sposta i file da una cartella all’altra. Il file batch è generato da un altro processo.
Alcuni dei file che ho bisogno di spostare hanno la stringa “% 20” in loro:
move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
Questo fallisce nel tentativo di trovare un file con il nome:
\\myserver\myfolder\file0name.txt
C’è un modo per ignorare %
? Non sono in grado di modificare il file generato per evitarlo, ad esempio raddoppiando i segni di percentuale ( %%
), evitando con /
o ^
(caret), ecc.
Dovresti essere in grado di utilizzare un segno di omissione (^) per evitare un segno di percentuale .
Nota del redattore: il collegamento è morto ora; in entrambi i casi: È %
stesso che sfugge al %
, ma solo nei file batch, non al prompt dei comandi; ^
mai ignora %
, ma al prompt dei comandi può essere utilizzato indirettamente per impedire l’espansione delle variabili, solo nelle stringhe non quotate .
La ragione per cui %2
sta scomparendo è che il file batch sta sostituendo il secondo argomento passato e sembra che tu non abbia un secondo argomento. Un modo per ovviare a ciò sarebbe in realtà provare foo.bat ^%1 ^%2...
modo che quando si incontra un %2
in un comando, esso viene effettivamente sostituito con un letterale %2
.
Devi usare %%
in questo caso. Normalmente l’uso di ^
(punto di inserimento) funzionerebbe, ma per i segni %
è necessario raddoppiare.
Nel caso di %%1
o %%i
o echo.%%~dp1
, perché %
indica l’input da un comando o da una variabile (quando circondato con %
; %variable%
)
Per ottenere ciò di cui hai bisogno:
move /y "\\myserver\myfolder\file%%20name.txt" "\\myserver\otherfolder"
Spero che aiuti!
Il titolo della domanda è molto generico , che attira inevitabilmente molti lettori alla ricerca di una soluzione generica.
Al contrario, il problema dell’OP è esotico : la necessità di gestire un file batch generato automaticamente che è mal formato e non può essere modificato : i segni %
non sono correttamente scappati in esso.
La risposta accettata fornisce una soluzione intelligente al problema specifico – ed esotico -, ma è destinata a creare confusione rispetto alla domanda generica .
Se ci concentriamo sulla domanda generica :
%
come carattere letterale in un file batch / sulla riga di comando? All’interno di un file batch , sfuggire sempre %
come %%
, sia in stringhe non quotate che non; i seguenti rendimenti My %USERNAME% is jdoe
, ad esempio:
echo My %%USERNAME%% is %USERNAME% echo "My %%USERNAME%% is %USERNAME%"
Sulla riga di comando (in modo interattivo) – così come quando si usano le funzioni di invocazione della shell dei linguaggi di scripting – il comportamento differisce fondamentalmente da quello all’interno dei file batch : tecnicamente, %
non può essere sfuggito lì e non c’è una soluzione unica che funzioni in tutte le situazioni :
Nelle stringhe non quotate , puoi usare il trucco ” ^
nome-disgregatore” : per semplicità, metti un ^
prima di ogni %
char , ma nota che anche se non stai tecnicamente scappando a %
questo modo (vedi sotto per maggiori informazioni); ad es., il seguente restituisce qualcosa come My %USERNAME% is jdoe
:
echo My ^%USERNAME^% is %USERNAME%
Nelle stringhe con virgolette doppie , non puoi sfuggire affatto a %
, ma esistono soluzioni alternative :
Puoi usare stringhe non quotate come sopra, che poi ti richiedono di aggiungere ^
-escape tutti gli altri metacaratteri della shell, che è ingombrante; questi metacaratteri sono:
In alternativa, se il programma di destinazione lo supporta ( dovrebbe funzionare con la maggior parte degli eseguibili binari , ma non con i file batch ), è ansible rappresentare %
caratteri. come "%"
; per esempio:
echo "My "%"USERNAME"%" is %USERNAME%"
Dai linguaggi di scripting , se sai che stai chiamando un eseguibile binario , potresti essere in grado di evitare l’intero problema rinunciando alle funzioni di richiamo della shell in favore delle varianti “senza shell” , come usare execFileSync
invece di execSync
in Node.js.
Punta del cappello per jeb per il suo aiuto con questa sezione.
Sulla riga di comando (in modo interattivo), %
può tecnicamente non essere scappato affatto ; mentre ^
è generalmente il carattere di escape di cmd.exe
, non si applica a %
.
Come indicato, non esiste una soluzione per le stringhe con virgolette doppie , ma esistono soluzioni alternative per le stringhe non quotate :
La ragione per cui il trucco ” ^
nome-disgregatore” (qualcosa come ^%USERNAME^%
) funziona è:
“Disturba” il nome della variabile ; cioè, nell’esempio sopra cmd.exe
cerca una variabile denominata USERNAME^
, che (si spera) non esiste.
Sulla riga di comando, diversamente dai file batch, i riferimenti a variabili non definite vengono mantenuti così come sono .
Tecnicamente, un singolo ^
all’interno del nome della variabile – ovunque al suo interno, a patto che non sia accanto a un altro ^
– è sufficiente, così che %USERNAME^%
, per esempio, sarebbe sufficiente, ma suggerisco di adottare la convenzione di collocamento metodico ^
prima di ogni %
per semplicità , perché funziona anche per casi come up 20^%
, in cui l’interruzione non è nemmeno necessaria, ma è benigna, quindi è ansible applicarla metodicamente , senza dover pensare alle specifiche di la stringa di input.
A ^
prima di una %
apertura , mentre non è necessario, è benigna, perché ^
sfugge al carattere successivo, indipendentemente dal fatto che quel personaggio abbia bisogno di scappare – o, in questo caso, può essere sfuggito – o meno. L’effetto netto è che tali istanze sono in definitiva rimosse da stringhe non quotate .
Avvertenza in gran parte ipotetica : ^
è in realtà un carattere legale nei nomi delle variabili (vedi l’esempio di jeb nei commenti); se il nome della variabile termina con ^
, è sufficiente posizionare il “disruptive” ^
da qualche altra parte nel nome della variabile, a condizione che non sia direttamente accanto a un altro ^
(poiché ciò causerebbe l’apparizione di un ^
nella stringa risultante).
Detto questo, nell’evento (molto improbabile) che la tua variabile abbia un nome come ^b^
, sei sfortunato.
Nei file batch, il segno di percentuale può essere “sfuggito” utilizzando un doppio segno di percentuale (%%). In questo modo, verrà utilizzato un singolo segno di percentuale all’interno della riga di comando. da http://www.robvanderwoude.com/escapechars.php
Penso di avere una soluzione parziale funzionante. Se stai solo cercando di trasferire file con la stringa “% 20” nel loro nome e senza cercare una soluzione più ampia, puoi fare in modo che un secondo file batch chiami il primo con %% 2 come secondo parametro. In questo modo, quando il tuo programma tenta di recuperare il secondo parametro quando raggiunge% 2 nel nome del testo, sostituirà% 2 con un escape% 2, lasciando invariato il nome del file.
Spero che questo funzioni!