2009-08-25 6 views
112

Come faccio a uscire dalla e commerciale in un file batch (o dalla riga di comando di di Windows) per utilizzare il comando start su aprire pagine Web con e commerciali nell'URL?Come faccio a uscire dalle e commerciali in file batch?

Le virgolette doppie non funzionano con start; ciò avvia invece una nuova finestra di comando .

Aggiornamento 1: la soluzione di Wael Dalloul funziona. Inoltre, se ci sono caratteri con codifica URL (ad esempio, lo spazio è codificato come % 20) nell'URL e è in un file batch quindi '%' deve essere codificato come '%%'. Questo non è il caso dell'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 

che si apre nel browser predefinito e questi errori nella finestra di 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 così dovrebbe funzionare ora. È solo una stranezza in 'start' che fa sì che l'argomento non funzioni se applicato senza pensare. E in generale penso che racchiudere l'argomento tra virgolette sia più facile e meno incline all'errore che sfuggire a ogni personaggio che ha bisogno di scappare. – Joey

+0

E il segno più '+' che cosa dovrei mettere davanti per sfuggire? – william

+0

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 virgolette] (https : //superuser.com/a/1208974/241386) –

risposta

39

Da un cmd:

  • & è sfuggito come questo: ^& (sulla base di @Wael Dalloul answer)
  • % non ha bisogno di essere sfuggito

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: ^&
  • % è sfuggito come questo (sulla base di answer @Wael Dalloul): %% (sulla base dell'aggiornamento 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 
+0

Potrebbe anche includere un esempio di escape "%" - quindi posso ripulire la mia domanda. –

+0

@PeterMortensen Definitely - Ho aggiornato la mia risposta. –

+1

Quali personaggi dovrei anche scappare? Ho notato che devo scappare "|" da "^ |". – liquide

24

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

Si noti che è necessario fornire un manichino primo argomento in questo caso, come start tratterà il primo argomento come un titolo per le nuove finestre di console, se è citato. Così il seguente dovrebbe funzionare (e lo fa qui):

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

OK, ammetto che il titolo non corrisponde completamente alla domanda interna. (Pensi che dovrei rendere il titolo più lungo?) –

+0

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

+0

[PowerShell eliminerà le virgolette dagli argomenti] (https://superuser.com/a/1208974/241386), quindi non funzionerà. Devi solo utilizzare "start" http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8 "' su PowerShell –

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

Wow, funziona anche tu. Tutti e 3 questi modi funzionano! – rogerdpack

131

& è usato per comandi separati. Pertanto è possibile utilizzare ^ per evitare &.

+3

E il segno più '+' che cosa dovrei mettere davanti per sfuggire? – william

+0

Questa è la soluzione più generale applicabile. Funziona anche se un parametro di un programma della riga di comando ha uno o più e commerciali in esso. Ho appena incontrato questo - il parametro era * CGW5COMM e 10C4 e 8301 *. –

+0

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

7

Il comando

echo this ^& that 

opere come previsto, outputing

this & that 

Il comando

echo this ^& that > tmp 

lavora anche, scrivendo la stringa al file "tmp". Tuttavia, prima di un tubo

echo this ^& that | clip 

il simbolo^viene interpretato in modo completamente diverso. Prova a scrivere l'output dei due comandi "echo this" e "that" alla pipe. L'eco funzionerà quindi "quel" darà un errore. Detto

echo this ^& echo that | clip 

inserirà le stringhe "questo" e "quello" negli appunti.

Senza il ^:

echo this & echo that | clip 

la prima eco scriverà alla console e solo l'uscita del secondo eco sarà convogliato a clip (analogamente per "> tmp" reindirizzamento). Quindi, quando l'output viene reindirizzato, il^non cita il & ma invece lo fa applicare prima del reindirizzamento piuttosto che dopo.

Per reindirizzare un &, bisogna citare due volte

echo this ^^^& that | clip 

Se si mette la stringa in una variabile

set m=this ^& that 

poi

set m 

uscita volontà

m=this & that 

ma l'ovvio

fallisce perché, dopo che Windows sostituisce la variabile, con conseguente

echo this & that 

analizza questo come un nuovo comando e cerca di eseguire "che".

in un file batch, è possibile utilizzare ritardato espansione:

setlocal enableDelayedExpansion 
echo !m! 

Per l'uscita ad un tubo, dobbiamo sostituire tutti & s nel valore della variabile con^&, che possiamo fare con VAR%: DA = TO% sintassi:

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

Nella riga di comando "cmd/v" consente espansione ritardata:

cmd /v /c echo !m! 

Questo funziona anche quando si scrive ad un tubo

cmd /v /c echo !m! | clip 

semplice.

+0

La tua soluzione per tubi funziona, ma le tue conclusioni sono più o meno sbagliate. Btw. un semplice 'eco questo ^^^ e quello | anche la clip' funziona. 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 in pipe?] (Http://stackoverflow.com/q/8192318/463115) – jeb

+0

Grazie per aver sottolineato che "echo% m% 'è inutilizzabile. – Jarekczek

0

Se è necessario per echo una stringa che contiene una e commerciale citazioni non aiuterà, perché li vedresti anche sull'output. In questo caso l'uso 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

L'aggiunta di questo per gli utenti futuri -

se si dispone di spazi nel nome del file E tu hai un personaggio che devi scappare: tu ca n usa virgolette singole e doppie per evitare errori nel comando.

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

Il carattere ^ sfugge alle citazioni altrimenti

modificato per includere la chiusura . alla fine del comando