Ignora il segno di percentuale nel file batch

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 si usa % 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.


Informazioni di base opzionali per l’uso da riga di comando (interattivo):

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!