Come posso evitare le e commerciali nei file batch?


146

Come posso evitare le e commerciali in un file batch (o dalla riga di comando di Windows) per utilizzare il startcomando per aprire pagine Web con e commerciali nell'URL?

Le virgolette doppie non funzionano con start; questo avvia invece una nuova finestra della riga di comando.

Aggiornamento 1 : la soluzione di Wael Dalloul funziona. Inoltre, se nell'URL sono presenti caratteri codificati nell'URL (ad esempio, lo spazio è codificato come% 20) e si trova in un file batch, '%' deve essere codificato come '%%'. Questo non è il caso nell'esempio.

Esempio, dalla riga di comando ( CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

si tradurrà in

http://www.google.com/search?client=opera 

viene aperto nel browser predefinito e questi errori nella finestra della riga di comando:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

Piattaforma: Windows XP 64 bit SP2.


1
Ho modificato la risposta di belugabob, quindi ora dovrebbe funzionare. È solo una stranezza in startcui fa fallire la citazione dell'argomento se applicato senza pensarci. E nel complesso penso che racchiudere l'argomento tra virgolette sia più facile e meno soggetto a errori che sfuggire a ogni personaggio che ha bisogno di fuggire.
Joey,

Che dire del segno più che +cosa dovrei mettere davanti per sfuggire?
William

In PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"funziona perché PowerShell
eliminerà le

Risposte:


91

Da un cmd :

  • &è sfuggito in questo modo: ^&(basato sulla risposta di @Wael Dalloul )
  • % non ha bisogno di essere evaso

Un esempio:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

Da un file batch

  • &è sfuggito in questo modo: ^&(basato sulla risposta di @Wael Dalloul )
  • %è sfuggito in questo modo: %%(basato sull'aggiornamento dei PO)

Un esempio:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8

Potrebbe anche includere un esempio di escape "%", quindi posso ripulire la mia domanda.
Peter Mortensen,

@PeterMortensen Sicuramente - ho aggiornato la mia risposta.
Lasse Christiansen,

2
A quali personaggi dovrei sfuggire? Ho notato che devo scappare "|" di "^ |".
liquide

In questo caso %non ha bisogno di essere sfuggito, perché chi sarebbe abbastanza sciocco da definire 20andcome variabile d'ambiente? Se lo facessi, start http://www.google.com/search?q=ampersand%20and%20percentagepotresti collegarti http://www.google.com/search?q=ampersandsomething-silly20percentageinvece. Usando ^%escape per cmd, l'esempio funziona come previsto.
TamaMcGlinn

145

&è usato per separare i comandi. Pertanto è possibile utilizzare ^per sfuggire al &.


3
Che dire del segno più che +cosa dovrei mettere davanti per sfuggire?
William

Questa è la soluzione più generale applicabile. Funziona anche se un parametro di un programma da riga di comando contiene una o più e commerciali. Ho appena riscontrato questo: il parametro era CGW5COMM e 10C4 e 8301 .
Peter Mortensen,

La citazione di una e commerciale con il carattere di carattere ^ non sembra funzionare in tutte le circostanze. Ad esempio, tentare di eseguire msdeploy.exe con l'opzione / p: passare per passare una password con una e commerciale non sembra funzionare con alcuna permutazione che ho provato (virgolette, virgolette doppie, primo argomento fittizio).
Derek Greer,

3
Un esempio di utilizzo ^sarebbe prezioso.
jpmc26,

2
@ jpmc26 Ho aggiunto un esempio in questa risposta .
Lasse Christiansen,

29

È possibile racchiuderlo tra virgolette, se si fornisce un primo argomento fittizio.

Nota che in questo caso devi fornire un primo argomento fittizio, poiché starttratterà il primo argomento come un titolo per le nuove finestre della console, se viene citato. Quindi dovrebbe funzionare (e funziona qui):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

OK, ammetto che il titolo non corrisponde completamente alla domanda all'interno. (Pensi che dovrei allungare il titolo?)
Peter Mortensen,

Non così "Doh", dopotutto - racchiudere tra virgolette l'idea giusta - semplicemente non sapeva nulla del titolo della finestra della console. Grazie Johannes!
belugabob,

PowerShell rimuoverà le virgolette dagli argomenti , quindi non funzionerà. Devi usare solo start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"su PowerShell
phuclv

20
explorer "http://www.google.com/search?client=opera&rls=...."

12

Il comando

echo this ^& that

funziona come previsto, in uscita

this & that

Il comando

echo this ^& that > tmp

funziona anche, scrivendo la stringa nel file "tmp". Tuttavia, prima di una pipa

echo this ^& that | clip

il ^ è interpretato in modo completamente diverso. Cerca di scrivere l'output dei due comandi "echo this" e "that" nella pipe. L'eco funzionerà quindi "quello" darà un errore. Detto

echo this ^& echo that | clip

inserirà le stringhe "this" e "that" negli appunti.

Senza il ^:

echo this & echo that | clip

il primo eco scriverà sulla console e solo il secondo output dell'eco verrà reindirizzato alla clip (analogamente per il reindirizzamento "> tmp"). Pertanto, quando viene reindirizzato l'output, ^ non cita il & ma invece lo fa applicare prima del reindirizzamento piuttosto che dopo.

Per convogliare un &, devi citarlo due volte

echo this ^^^& that | clip

Se si inserisce la stringa in una variabile

set m=this ^& that

poi

set m

uscirà

m=this & that

ma l'ovvio

echo %m%

fallisce perché, dopo che Windows ha sostituito la variabile, si ottiene

echo this & that

analizza questo come un nuovo comando e tenta di eseguire "quello".

In un file batch, è possibile utilizzare l'espansione ritardata :

setlocal enableDelayedExpansion
echo !m!

Per eseguire l'output in una pipe, dobbiamo sostituire tutti i & s nel valore della variabile con ^ &, cosa che possiamo fare con la sintassi% VAR: FROM = TO%:

echo !m:^&=^^^&! | clip

Sulla riga di comando, "cmd / v" abilita l'espansione ritardata:

cmd /v /c echo !m!

Funziona anche quando si scrive su una pipe

cmd /v /c echo !m! | clip

Semplice.


La tua soluzione per i tubi funziona, ma le tue conclusioni sono più o meno sbagliate. Btw. anche un semplice echo this ^^^& that | clipfunziona. Per capire la gestione delle pipe magiche potresti leggere SO: Perché l'espansione ritardata fallisce quando si trova all'interno di un blocco di codice con pipe?
Jeb

1

Se hai bisogno di echouna stringa che contiene una e commerciale, le virgolette non ti aiuteranno, perché le vedresti anche nell'output. In tal caso, utilizzare for:

for %a in ("First & Last") do echo %~a

... in uno script batch:

for %%a in ("First & Last") do echo %%~a

o

for %%a in ("%~1") do echo %%~a

0

Se hai spazi nel nome del file e hai un carattere devi scappare:

È possibile utilizzare virgolette singole e doppie per evitare errori di definizione nel comando.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

Il ^personaggio sfugge alle virgolette altrimenti.

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.