2008-11-20 4 views
49

ich einen URL-Präfix in einem Windows-Umgebungsvariable gespeichert werden soll. Das Ampersands in der Abfrage-Zeichenfolge macht dies jedoch lästig.in Windows-Skripts

Beispiel: Ich habe ein URL-Präfix von http://example.com?foo=1&bar= und möchte eine vollständige URL erstellen, indem Sie einen Wert für den Parameter bar angeben. Ich möchte dann diese URL mit dem Befehl "start" starten.

Anführungszeichen um den Wert für den SET-Vorgang ist ganz einfach genug:

set myvar="http://example.com?foo=1&bar=" 

Windows die Anführungszeichen in dem tatsächlichen Wert enthält aber (dank Windows-!):

echo %myvar% 
"http://example.com?foo=1&bar=true" 

ich, dass ich weiß, kann weg von Batch-Dateiargumente mit Hilfe von Tilde streichen:

Allerdings ich kann scheinbar nicht zu benannten Variablen zu tun:

echo %~myvar% 
%~myvar% 

Was ist die Syntax dafür?

+11

In seltenen Fällen eine Frage allein hilft ich mein aktuelles Problem zu lösen (wie Zitate aus einem Batch-Datei Argumente strippen). Hier ist es passiert. Danke und +1 :-) – Jan

+0

Gleiches hier, danke! –

Antwort

26

ist keine Einschränkung der Umgebungsvariablen, sondern die Kommando-Shell.

die gesamte Zuordnung in Anführungszeichen ein:

set "myvar=http://example.com?foo=1&bar=" 

Obwohl, wenn Sie versuchen, dies zu Echo, es wird sich beschweren, wie die Shell eine Pause dort sehen.

Sie können es echo durch die var name in Anführungszeichen gesetzt:

echo "%myvar%" 

Oder besser, verwenden Sie einfach den Befehl set den Inhalt anzuzeigen:

set myvar 
+0

sehr hilfreich danke. setze "myvar = http: //beispiel.com? foo = 1 & bar =" –

+0

Sollte das mit SET/P funktionieren? Ich versuche SET/P "var = question". var ist dann gleich „meine Antwort mit Leerzeichen“ – RoboJ1M

-1

Ich denke, das sollte es tun:

for /f "tokens=*" %i in (%myvar%) do set %myvar%=%~i 

Aber Sie brauchen das nicht,

set myvar="http://example.com?foo=1&bar=" 
start "" %myvar% 

Wird arbeiten, müssen Sie nur einen Titel auf den Startbefehl liefern. Diese

+0

Der Startbefehl funktioniert nicht. Das Und-Zeichen in der URL beendet die Zeile und löscht damit den letzten URL-Parameter. Es startet den Browser, aber es ist die falsche URL. –

35

echo% myvar: "=%

+5

Eine weniger knappe Antwort auf http://stackoverflow.com/a/5181182/508355 verfügbar ist – hashchange

+8

Dies würde alle Anführungszeichen entfernen, nicht nur rund um quotes ... –

+0

dies ist ein gut vorschlagen für mich als das gleiche @ zdan beantwortet. –

2

Verwendung verzögerte Erweiterung von Umgebungsvariablen und verwenden var:! ~ 1, -1, die Anführungszeichen zu entfernen:

@echo off 
setlocal enabledelayedexpansion 
set myvar="http://example.com?foo=1&bar=" 
set myvarWithoutQuotes=!myvar:~1,-1! 
echo !myvarWithoutQuotes! 
1

Verwenden Sie mehrere Variablen, es zu tun:

set myvar="http://example.com?foo=1&bar=" 

set bar=true 

set launch=%testvar:,-1%%bar%" 

start iexplore %launch% 
+0

Um ... 'myvar' oder' testvar' oder was? –

2

nur zu entfernen beginnen und Zitate aus einer variablen Endung:

SET myvar=###%myvar%### 
SET myvar=%myvar:"###=% 
SET myvar=%myvar:###"=% 
SET myvar=%myvar:###=% 

Diese Sie eine ### nicht haben geht davon aus „oder“ ### in Ihrem Wert und funktioniert nicht, wenn die Variable NULL ist.

Kredit geht für diese Methode http://ss64.com/nt/syntax-esc.html.

9

Dies funktioniert

for %a in (%myvar%) do set myvar=%~a 

Ich würde dies auch verwenden, wenn ich eine Variable drucken wollte, die ohne die Anführungszeichen enthalten und Ampersand.

for %a in ("fish & chips") do echo %~a 
6

Zwar gibt es mehrere gute Antworten bereits, eine andere Art und Weise Anführungszeichen zu entfernen, ist ein einfaches Unterprogramm zu verwenden:

:unquote 
    set %1=%~2 
    goto :EOF 

Hier ist ein komplettes Anwendungsbeispiel:

@echo off 
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS 

set words="Two words" 
call :unquote words %words% 
echo %words% 

set quoted="Now is the time" 
call :unquote unquoted %quoted% 
echo %unquoted% 

set word=NoQuoteTest 
call :unquote word %word% 
echo %word% 

goto :EOF 

:unquote 
    set %1=%~2 
    goto :EOF 
+0

Froh, dass jemand anderes daran gedacht hat, tiefer zu denken - was ist, wenn die Variable keine Anführungszeichen hat? wäre schön, einen frühen Abbruch Check zu haben, und nicht nur die bestehende var Kürzen ... – BrainSlugs83

+0

% ~ 2 entfernt alle umschließenden Anführungszeichen. Wenn keine Anführungszeichen vorhanden sind, wird sie nicht abgeschnitten. – jimhark

+0

Was ist der 'rem set% 1 =% ~ 2' für? Es sieht wie ein auskommentiertes Duplikat der nächsten Zeile aus. Wenn der Inhalt der Variablen nicht in Anführungszeichen steht und ein Leerzeichen enthält, scheint dies alles nach dem ersten Leerzeichen abzuschneiden. Wenn ich nicht etwas falsch gemacht habe, scheint das für den Umgang mit Dateinamen ungeeignet zu sein. – jpmc26

0
@echo off 
set "myvar=http://example.com?foo=1&bar=" 
setlocal EnableDelayedExpansion 
echo !myvar! 

Dies liegt daran, dass die Variable spezielle Shell-Zeichen enthält.