viprex
Goto Top

Batch - Ändern der Umgebungsvariable PATH

Hallo,
ich möchte mit Hilfe eines Batch Skriptes einen Pfad zur Umgebungsvariablen PATH hinzufügen. Dabei sollte geprüft werden, ob dieser Pfad schon enthalten ist. Das ganze soll mit Windows XP SP2 Boardmitteln realisiert und dann als GPO-Startskript ausgeführt werden.

Folgende Ideen habe ich ausprobiert:

Methode 1
1. Auslesen von PATH aus der Registry ("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" - Path - REG_EXPAND_SZ) mittels reg.exe QUERY:
@for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set x=%%i  
@echo %x%
2. Konkatenieren des Inhaltes von x mit dem hinzuzufügenden Pfad:
set neu=%x%;MeinPfad
3. Zurückschreiben der Variablen in die Registry:
@REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%neu%" /f  

Probleme
Beispiel: PATH= C:\Mein\tolles Programm;C:\mein\Programm
Ergebnis von reg query: C:\Mein\tolles
-> Das Leerzeichen im Pfad fungiert anscheinend als Trennzeichen. Ich weiß leider nicht, wie ich das umgehen kann.
-> Auch weiß ich nicht, wenn ich die Pfade dann korrekt in %x% stehen hätte, wie ich darin suchen könnte, ob der hinzuzufügende Pfad schon enthalten ist. Dann soll der Pfad natürlich nicht hinzugefügt werden.

Methode 2
1. Benutzen der Umgebungsvariablen %PATH% direkt.
2. Rest wie oben.

Probleme
-> Auch hier weiß ich nicht, wie ich filtern kann, ob der Pfad schon enthalten ist.
-> Außerdem wird bei zurückschreiben der Variablen in die Registry der PATH falsch geändert. Dort steht dann sinngemäß: \\domänencontroller\...sysvol\..policies\...\speicherort des Startskriptes. Ich weiß wohl, was das für ein Ort ist (An diesem Ort liegt das Startskript in der GPO). Ich weiß aber nicht, warum dies geschieht face-sad

Ich würde mich freuen, wenn mir hier jemand unter die Arme greifen könnte. Auch über ganz neue Vorschläge für Lösungswege würde ich mich freuen. Nichts desto trotz interessiert mich auch, wie ich zumindest das Auslesen aus der Reg. korrekt hinbekommen würde, sodass das Leerzeichen kein Problem mehr darstellt. Und wie man korrekt aus dem ganzen Stringkram filter und daraus dann mittels if Abfrage entscheiden kann, ob der Pfad schon vorhanden ist oder nicht.

Vielen Dank für eure Hilfe!

Content-ID: 116473

Url: https://administrator.de/contentid/116473

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

78632
78632 20.05.2009 um 14:11:26 Uhr
Goto Top
Zitat von @Viprex:
2. Konkatenieren des Inhaltes von x mit dem hinzuzufügenden
Pfad:

geht so:
set path="X:\Mein neuer Pfad";%path%  

Es stört auch nicht, wenn der Pfad bereits vorhanden war. face-wink Direkte Änderungen sind über die Systemsteuerung > Erweitert > Umgebungsvariablen auch möglich.

Änderungen über die Registry erfordern Neuanmeldung/Neustart, bevor sie wirksam sind. Das Auslesen ist nach meinem Meinung auch überflüssig, da die Umgebungsvariable Path bereits Auskunft über den Inhalt gibt. face-wink
Wenn du das aber trotzdem über die Registry lösen willst, musst du auch den Userteil der Umgebungsvariablen beachten;
HKEY_CURRENT_USER\Environment

Du kannst aber zum direkten Ändern SETX aus dem Ressource-Kit verwenden.
77559
77559 20.05.2009 um 14:11:49 Uhr
Goto Top
Hallo Viprex,

meine Behelfslösung sieht so aus:

Set NeuerPfad=C:\Irgendwas
For %%A in ("%PAth:;=" "%") do if /i %%A=="%NeuerPfad%" echo Pfad schon enthalten  

Gruß
LotPings
Viprex
Viprex 20.05.2009 um 15:34:34 Uhr
Goto Top
Zitat von @78632:
> set path="X:\Mein neuer Pfad";%path%  
> 
ahh, sehr schön. Das ist natürlich deutlich einfacher als mein Registry KungFu. Mal schauen, wie das so funktioniert.


Es stört auch nicht, wenn der Pfad bereits vorhanden war. face-wink
doch, stört es. Auch mit deinem Code wird der Pfad immer wieder hinzugefügt. Das kann letztenendes darin resultieren, dass der Pfad dann X mal drin steht. Das macht zwar erstmal nichts, tut ja aber nicht not.


Direkte Änderungen sind über die Systemsteuerung >
Erweitert > Umgebungsvariablen auch möglich.
Klar, den Weg will ich aber nicht gehen. Dafür sind es zu viele Rechner die ich anfassen muss (zumal da noch mehr gemacht wird, nach dem Ändern von PATH).


Änderungen über die Registry erfordern
Neuanmeldung/Neustart, bevor sie wirksam sind.
Kein Problem.


Das Auslesen ist nach meinem Meinung auch überflüssig, da die Umgebungsvariable Path bereits Auskunft über den Inhalt gibt. face-wink
Wenn du das aber trotzdem über die Registry lösen willst, musst du auch den Userteil der Umgebungsvariablen beachten; HKEY_CURRENT_USER\Environment
Eigentlich nicht, der Systemteil reicht mir eigentlich. Der Systemteil gilt ja für alle User, also sollten User spezifische Änderungen nicht notwendig sein. Im HKCU\Enviroment steht ja auch nicht die PATH Variable drin, sondern nur TEMP und TMP.
Oder habe ich hier einen Denkfehler?


Du kannst aber zum direkten Ändern
[http://blog.m-ri.de/index.php/2008/09/29/setx-der-kleine-helfer-fuer-die-wechselnden-environment-variablen-des-entwicklers/
SETX aus dem Ressource-Kit] verwenden.
Schaue ich mir gerne an, wenn möglich will ich dieses Problem aber ohne Extra Tools lösen.


Zitat von @77559:
> Set NeuerPfad=C:\Irgendwas
> For %%A in ("%PAth:;=" "%") do if /i %%A=="%NeuerPfad%" echo Pfad schon enthalten  
> 
Das funktioniert hervorragend! Herzlichen Dank. Damit komme ich der Problemlösung ein ganzes Stück näher. Magst du mir vielleicht erklären, was da passiert?

Klar ist mir, dass er %PATH% durchgeht. Was ist aber das Trennzeichen bei dir? inbesondere den Teil :;=" "% verstehe ich nicht.
Er prüft dann wahrscheinlich im "do Teil" für jeden gefundenen Pfad, ob es sich um meinen Pfad handelt (if %%A=="%NeuerPfad%). Ich würde mich freuen, wenn du mir also den inneren Teil der For Schleife erklären würdest.


Hat auch noch jemand die Lösung für mich bzgl. des Auslesens aus der Registry für mich? Warum trennt er bei meinem Code immer beim Leerzeichen in den Pfaden? Ich weiß, das ich das für meine Lösung nicht mehr benötige, aber interessieren würde es mich schon, wenn es nicht zu viel Aufwand ist.
@for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set x=%%i   
@echo %x%
78632
78632 20.05.2009 um 16:03:17 Uhr
Goto Top
Zitat von @Viprex:
> Zitat von @78632:
> Es stört auch nicht, wenn der Pfad bereits vorhanden war.
face-wink
doch, stört es. Auch mit deinem Code wird der Pfad immer wieder
hinzugefügt. Das kann letztenendes darin resultieren, dass der
Pfad dann X mal drin steht. Das macht zwar erstmal nichts, tut ja aber
nicht not.

Es stört nur, wenn man nach erfolgter Änderung das Script nochmal und immer wieder laufen lässt. face-wink


Im HKCU\Enviroment steht ja auch
nicht die PATH Variable drin, sondern nur TEMP und TMP.
Oder habe ich hier einen Denkfehler?

Möglicherweise. Der User kann eine eigene Erweiterung für die PATH-Umgebungsvariable eintragen. Die steht dann im Userteil.
77559
77559 20.05.2009 um 16:06:11 Uhr
Goto Top
Zitat von @Viprex:
Das funktioniert hervorragend! Herzlichen Dank. Damit komme ich der
Problemlösung ein ganzes Stück näher. Magst du mir
vielleicht erklären, was da passiert?

Klar ist mir, dass er %PATH% durchgeht. Was ist aber das Trennzeichen
bei dir? inbesondere den Teil :;=" "% verstehe ich nicht.
Er prüft dann wahrscheinlich im "do Teil" für
jeden gefundenen Pfad, ob es sich um meinen Pfad handelt (if
%%A=="%NeuerPfad%). Ich würde mich freuen, wenn du mir also
den inneren Teil der For Schleife erklären würdest.

Nicht direkt, um das Problem der Leerzeichen zu umgehen kann/muß man Anführungszeichen setzen. Die sollten deshalb auch NIEMALS selbst in den Pfad gesetzt werden.

Hier mal ein exemplarischer SQL Server Teil-Pfad:
Path=c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\
Was meine Angabe "%Path:;=" "%" macht ist erstmal außen herum Anführungszeichen zu setzen und zweitens per "Ersetzen von Umgebungsvariablen" siehe in der Hilfe von set /? alle Semikolon durch " " auszutauschen.

Dieser Inhalt
"c:\Program Files\Microsoft SQL Server\100\Tools\Binn\" "c:\Program Files\Microsoft SQL Server\100\DTS\Binn\"
lässt sich durch die for Schleife jetzt ganz einfach verarbeiten.

Hat auch noch jemand die Lösung für mich bzgl. des Auslesens aus der Registry für mich? Warum trennt er bei meinem Code immer beim Leerzeichen in den Pfaden? Ich weiß, das ich das für meine Lösung nicht mehr benötige, aber > interessieren würde es mich schon, wenn es nicht zu viel Aufwand ist.
Kein Problem, es gibt das token * welches alle (restlichen) Elemente umfasst, damit es ab dem dritten token wirkt nimm einfach Dummy Token dazu.
Den Buchstaben mußt du natürlich dann erhöhen.
@for /f "tokens=2*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j"  
@echo %x%

Gruß
LotPings
Viprex
Viprex 20.05.2009 um 19:09:23 Uhr
Goto Top
Klasse, ihr beiden seid toll. Herzlichen Dank für die tolle Hilfe!

Zitat von @78632:
Es stört nur, wenn man nach erfolgter Änderung das Script
nochmal und immer wieder laufen lässt. face-wink
Das kann ich leider nicht ausschließen. Wol funktioniert bei uns nicht, sodass ich darauf angewiesen bin, die Rechner morgens durch die User hochfahren zu lassen. Leider kann ich eben nicht ausschließen, dass das Skript mehrmals ausgeführt wird (oder gibt es da eine Möglichkeit mit GPO Bordmitteln?

Möglicherweise. Der User kann eine eigene Erweiterung für die PATH-Umgebungsvariable eintragen. Die steht dann im Userteil.
Ja, aber das ist nicht passiert. Wie auch immer, das Hinzufügen meines neuen Pfades wird sich dann nicht negativ auswirken, selbst wenn der User soetwas gemacht hat. Und er hat ganz sicher nicht den jetzt hinzuzufügenden Pfad dort drin stehen. Den gab es bis vor kurzem noch nicht face-smile


Zitat von @77559:
Nicht direkt, um das Problem der Leerzeichen zu umgehen
kann/muß man Anführungszeichen setzen. Die sollten deshalb
auch NIEMALS selbst in den Pfad gesetzt werden.
Ok, verstanden. Auf die Idee wäre ich auch nicht gekommen.

Hier mal ein exemplarischer SQL Server Teil-Pfad:
Path=c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\
Was meine Angabe "%Path:;=" "%" macht ist erstmal außen herum Anführungszeichen zu setzen und zweitens per "Ersetzen von Umgebungsvariablen" siehe in der Hilfe von set /? alle Semikolon durch " " auszutauschen.

Dieser Inhalt
"c:\Program Files\Microsoft SQL
> Server\100\Tools\Binn\" "c:\Program Files\Microsoft SQL
> Server\100\DTS\Binn\"
lässt sich durch die for Schleife jetzt ganz einfach verarbeiten.
Ist der Doppelpunkt die Anweisung zum Ersetzen? Klar das ;=" " ausdrückt, dass das Semikolon "gleich" dem Ausdruck " " sein soll.


Kein Problem, es gibt das token * welches alle (restlichen) Elemente
umfasst, damit es ab dem dritten token wirkt nimm einfach Dummy Token
dazu.
Den Buchstaben mußt du natürlich dann erhöhen.
> @for /f "tokens=2*" %%i in ('reg query  
> "HKLM\SYSTEM\CurrentControlSet\Control\Session  
> Manager\Environment" /v Path') do @Set "x=%%~j"  
> @echo %x%
> 

Bedeutet tokens=2* also, dass alles inklusive dem 2. Token genommen wird oder ist das schon der Rest? Warum muss ich dann hochzählen? Steht in %%i dann das Token 2 und in %%j der Rest? Und warum steht dort ein Tilde (~)?
77559
77559 20.05.2009 um 21:23:57 Uhr
Goto Top
Zitat von @Viprex:
Ist der Doppelpunkt die Anweisung zum Ersetzen? Klar das ;=" " ausdrückt, dass das Semikolon "gleich" dem Ausdruck " " sein soll.
Im Prinzip schon. HAST DU DIE AUSGABE VON Set /? GELESEN?
Da steht das alles drin.

@for /f "tokens=2*" %%i in ('reg query  
"HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j"  
@echo %x%
Bedeutet tokens=2* also, dass alles inklusive dem 2. Token genommen wird oder ist das schon der Rest? Warum muss ich dann hochzählen? Steht in %%i dann das Token 2 und in %%j der Rest? Und warum steht dort ein Tilde (~)?
Nein Token 2 kommt in die variable %%i " Das ist dann REG_SZ und hier eben der nicht benötigte Dummy. Alle folgenden Elemente kommen in die nächste Variable %%j.
Die Tilde ~ ist in der Hilfe zum For Befehl erklärt. Sie entfernt ggfs in der Variable enthaltene äußere Anführungszeichen. Die würden den Set Befehl sonst unter Umständen aus dem Tritt bringen.

Gruß
LotPings

Edit: i -> j
Viprex
Viprex 23.05.2009 um 12:14:52 Uhr
Goto Top
Zitat von @77559:
Im Prinzip schon. HAST DU DIE AUSGABE VON Set /? GELESEN?
Da steht das alles drin.

Sorry. Ja, Jetzt, ja face-smile Bin da noch nicht früher zu gekommen:

Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:

%PATH:str1=str2%

Dies erweitert die PATH-Umgebungsvariable, wobei jede Instanz von "str1" im erweiterten Ergebnis mit "str2" ersetzt wird. "str2" kann die leere Zeichenfolge sein, um alle Instanzen > von "str1" aus der erweiterten Ausgabe zu löschen. Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles zwischen dem Anfang der erweiterten Ausgabe bis zum ersten
Auftreten des übrigen Abschnitts von "str1".


Nein Token 2 kommt in die variable %%i " Das ist dann REG_SZ und hier eben der nicht benötigte Dummy. Alle folgenden Elemente kommen in die nächste Variable %%i.
Die Tilde ~ ist in der Hilfe zum For Befehl erklärt. Sie entfernt ggfs in der Variable enthaltene äußere Anführungszeichen. Die würden den Set Befehl sonst unter Umständen aus dem Tritt bringen.

Kewl, danke! Ich sollte mich doch noch intensiver mit dem Hilfen beschäftigen. Dort steht ja wirklich allerhand drin.
78632
78632 23.05.2009 um 12:20:08 Uhr
Goto Top
Hierbei hat sich bei LotPings offenbar ein Flüchtigkeitsfehler eingeschlichen:

Nein Token 2 kommt in die variable %%i " Das ist dann REG_SZ und hier eben der nicht benötigte Dummy. Alle folgenden Elemente
kommen in die nächste Variable %%i.

Die nächste Variable ist %%j und nicht %%i face-wink
Viprex
Viprex 23.05.2009 um 12:34:10 Uhr
Goto Top
Ja, das habe ich mir eben beim Lesen auch gedacht. Im Code stehts ja auch richtig face-smile
77559
77559 23.05.2009 um 12:54:52 Uhr
Goto Top
Zitat von @Viprex:
Kewl, danke! Ich sollte mich doch noch intensiver mit dem Hilfen beschäftigen. Dort steht ja wirklich allerhand drin.
So ist es.
Rob van derVoude hat auch eine Batchdatei allhelp.bat geschrieben die diese Hilfen sammelt und in eine HTML-Datei mit Index schreibt. Leider klappt das bei neueren Windows mit teilweiser Unicode-Ausgabe nicht mehr so gut mit der Umlaut-Darstellung.

Gruß
LotPings
Viprex
Viprex 02.06.2009 um 14:38:14 Uhr
Goto Top
Hallo.

Ich habe im Zusammenhang mit der Pfad Variablen noch eine Frage und hoffe, ihr helft mir nochmal dabei.
Ich möchte aus der Pfad Variablen jetzt, sofern vorhanden, einen alten Pfad rauslöschen. Dies muss sein, da der alte und neue Pfad zusammen nicht korrekt funktionieren. Dazu habe ich 2 Ansätze, die beide ohne externe Hilfsmittel arbeiten. Schön wäre es, wenn das so bleibt.

1. Möglichkeit
 
@echo off
Set AlterPfad=C:\Mein Pfad
Set NeuerPfad=

For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" call :Blimblim %%~A  
goto end

:Blimblim
@set "NeuerPfad=%NeuerPfad%;%%~A  
goto :eof

:end
echo %NeuerPfad%

Hier bekomme ich den Paramter in die Subroutine nicht übergeben. Die neue Variable lautet dann später ;%%~A;%%~A;....
Auch wüsste ich nicht, wie ich %%A in der Zeile erst in eine Variable wegspeichern könnte und den Call dann mit der Variable aufrufen würde.

2. Möglichkeit
 
@echo off
Set AlterPfad=C:\Mein Pfad
Set NeuerPfad=

For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" @set "NeuerPfad=%NeuerPfad%;%%~A"  
goto end

:end
echo %NeuerPfad%

Funktioniert so leider auch nicht. Leider sehe ich nicht, warum.

Freue mich auf eure Antworten.

Vielen Dank,
Tim
78632
78632 02.06.2009 um 14:50:39 Uhr
Goto Top
Wenn du eine Variable aufrufst, deren eigenen Wert du ändern willst, musst du EnableDelayedExpansion nutzen und im 2 Aufruf statt des %-Zeichens das !-Zeichen verwenden.

Das sollte funktionieren:
@echo off & setlocal EnableDelayedExpansion
Set AlterPfad=C:\Mein Pfad
Set NeuerPfad=

For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" @set "NeuerPfad=!NeuerPfad!%%~A;"  
goto end

:end
echo %NeuerPfad%
pause

Pause kannst du ja dann wegnehmen, wenn du das Ergebnis für gut befindest. face-wink
Viprex
Viprex 02.06.2009 um 14:59:28 Uhr
Goto Top
Yeah, herzlichen Dank! Funktioniert super.

Aus reiner Neugierde: Wo liegt der Fehler beim Call und der Paramterübergabe? Warum kann ich die Zählparameter aus der For-Schleife nicht übergeben?
78632
78632 02.06.2009 um 15:02:55 Uhr
Goto Top
Wenn die möglicherweise doppelten ;; am Ende der neuen Path-Variablen stören sollten, kannst du 1 wegnehmen:
:end
Set NeuerPfad=%NeuerPfad:~0,-1%


Aus reiner Neugierde: Wo liegt der Fehler beim Call und der
Paramterübergabe?
Du übergibst %%A, daraus wird in der Subroutine %1 face-wink
Viprex
Viprex 02.06.2009 um 15:25:02 Uhr
Goto Top
Zitat von @78632:
Wenn die möglicherweise doppelten ;; am Ende der neuen
Path-Variablen stören sollten, kannst du 1 wegnehmen:
> :end
> Set NeuerPfad=%NeuerPfad:~0,-1%
> 
Sehr schön. Momentan habe ich ein ; am Anfang der Pfadvariablen. Die bekomme ich sicherlich noch weg. Bin jetzt gleich im Feierabend, daher gehts morgen weiter. Aber interessant, das set auch hier wieder so tolle Funktionen hat. Danach hätte ich bei set mal wieder nicht gesucht, obwohl ich weiter oben schon eingestehen musste, dass die Hilfe von set wohl ein sehr guter Anlaufpunkt sei face-smile


> Aus reiner Neugierde: Wo liegt der Fehler beim Call und der
> Paramterübergabe?
Du übergibst %%A, daraus wird in der Subroutine %1 face-wink

Ahh, ok. Von %0 bis %9 habe ich gelesen, konnte aber den Zusammenhang noch nicht herstellen.

Nochmal vielen Dank für die schnelle Hilfe!
78632
78632 02.06.2009 um 15:51:06 Uhr
Goto Top
Zitat von @Viprex:
Momentan habe ich ein ; am Anfang der Pfadvariablen.

Dann hast du meine Änderung nicht vollständig übernommen.
Dein "NeuerPfad" ist am Anfang leer, also wird - so wie du das ursprünglich gelöst hast - zuerst dein ";" gesetzt.

Du kannst das aber durch
:end
Set NeuerPfad=%NeuerPfad:~1% 
lösen
Viprex
Viprex 03.06.2009 um 13:39:56 Uhr
Goto Top
Zitat von @78632:
Dann hast du meine Änderung nicht vollständig übernommen.

Stimmt. Ich habe das ; noch in meiner Zeile drin. Ist jetzt aber alles gelöst. Bin da erst jetzt wieder zu gekommen, war gestern schon nicht mehr wirklich am Arbeiten beim letzten Post face-smile

Vielen Dank für die Hilfe!
Viprex
Viprex 03.06.2009 um 15:18:45 Uhr
Goto Top
Ich hätte doch noch eine Frage, die jetzt nicht direkt zur PATH Variablen gehört, aber bestimmt schnell abgearbeitet ist:

@echo off
For /f "delims==" %%A in ('Dir "C:\Dokumente und Einstellungen\*.*" /b') do call :DeleteCopyLNK "%%~A"  
goto end

:DeleteCopyLNK
set full=%1
set full=%full:~1,-1%
@set Pfad=%systemdrive%\Dokumente und Einstellungen\%full%\Desktop
@del /F /Q "%Pfad%\test.lnk"  
goto :eof

:end
pause

Meine Fragen:
Wenn ich
For /f "delims==;" %%A in ('Dir "C:\Dokumente und Einstellungen\*.*" /b') do call :DeleteLink %%~A  
schreibe, dann wird %1 z. B. beim Verzeichnis All Users mit All gefüllt, also ohne User. Das Leerzeichen stört anscheinend bei der Paramterübergabe.
Bekomme ich das irgendwie anders hin?

2. Gibt es eine Möglichkeit, falls es wie zuvor gefragt keinen anderen Weg gibt bei der Parameterübergabe, %1 direkt zu bearbeiten? Momentan gehe ich ja den Umweg über die Variable full. Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.

Danke.
78632
78632 03.06.2009 um 15:36:59 Uhr
Goto Top
Zitat von @Viprex:
Das Leerzeichen stört anscheinend bei der Paramterübergabe.

Logisch. Das Leerzeichen ist ein Parametertrennzeichen. Mit der Tilde in "%%~A" nimmst du die Anführungszeichen ja wieder weg.

Bekomme ich das irgendwie anders hin?
Ja, indem du den Variablenbezeichner mit Anführungszeichen umschließt: "%%A"

Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.

Funktioniert doch, wenn du die "" lässt. face-smile

Im einfachsten Fall erkennt man Fehler, wenn vor der Ausführung entsprechende @echo .... & pause - Befehle einfügt. Dann kann man sich ansehen, was dabei rauskommen würde.

Die Lösung deines aufgeführten Problems kannst du aber auch mit einem Einzeiler lösen (auf der Kommandozeile nur 1 %-Zeichen verwenden):
For /f "delims==" %%A in ('Dir "C:\Dokumente und Einstellungen\test.lnk" /b /s') do del "%%A"   
77559
77559 03.06.2009 um 16:21:53 Uhr
Goto Top
Zitat von @78632:
> Das geht zwar, aber aus Neugierde frage ich mich, warum set full=%1:~1,-1% nicht funktioniert.
Funktioniert doch, wenn du die "" lässt. face-smile
Sorry,
aber er meint wohl die direkte Extraktion von Postion,Länge aus einem Batchparameter.

Das geht wohl nicht weil die Syntax nicht eindeutig wäre,
bei einer Umgebungsvariable hat man ein abschließendes Prozent-/Ausrufezeichen.
Die doppelten Prozentzeichen kennzeichnen die Schleifenvariablen mit der Möglichkeit der Tilde Kommandos,
die ja auch bei den Batchparametern funktionieren.

Es gibt ja so schon Situationen wo der Parser nicht eindeutig arbeiten kann,
wenn man einstellige Buchstaben als Umgebungsvariablenamen benutzt.

Gruß
LotPings
Viprex
Viprex 03.06.2009 um 16:50:08 Uhr
Goto Top
So richtig habe ich jetzt nicht verstanden, was geht und was nicht. Klar, die Eindeutigkeit bei %1 muss gewährleistet bleiben. Also bleibt nur der Umweg über die zusätzliche Variable.

Aber die Parameterübergabe bekomme ich dennoch nicht richtig hin.

"%%A" hat ja immer noch die %-Zeichen drum herum.

%%A hat das Leerzeichen Problem.

Was muss ich also schreiben, um einen Parameter, der Leerzeichen enthält, ohne umschließende Anführungsstriche übergeben zu können? Oder geht das nicht?
78632
78632 03.06.2009 um 16:53:38 Uhr
Goto Top
@77559
Stimmt, haste Recht. face-smile

Ich hatte die Zeile 07 aus seinem Script betrachtet.
77559
77559 03.06.2009 um 16:57:04 Uhr
Goto Top
Zeile 06 aus deinem Beispiel so ändern:

Set "Full=%~1"  

Gruß
LotPings

Edit und Zeile 07 raus
78632
78632 03.06.2009 um 17:05:59 Uhr
Goto Top
"%%A" hat ja immer noch die %-Zeichen drum herum.
Du hattest aber "%%~A" geschrieben, und mit der Tilde ~ werden die umschließenden Anführungszeichen ja wieder weggenommen.

Was muss ich also schreiben, um einen Parameter, der Leerzeichen enthält, ohne umschließende Anführungsstriche
übergeben zu können? Oder geht das nicht?

Das geht nicht. Einen Parameter mit darin enthaltenen Leerzeichen musst du in Anführungszeichen setzen, also in deinem Fall "%%A"
Viprex
Viprex 03.06.2009 um 18:10:34 Uhr
Goto Top
Zitat von @77559:
Zeile 06 aus deinem Beispiel so ändern:

> Set "Full=%~1"  
> 

Gruß
LotPings

Edit und Zeile 07 raus

Ok, danke! Das ist ja nochmal eine Zeile weniger face-smile Außerdem macht die Tilde alles von alleine richtig. Wer weiß ob ich mit dem manuellen Weglassen von Zeichen 1 und dem letzten Zeichen in %1 immer richtig liege.

Ich hatte nur gehofft, entweder Parameter mit Leerzeichen übergeben zu können oder mit der Variable %1 direkt weiterarbeiten zu können. Naja, jetzt nutze ich eben die Variable Full. Es macht hier übrigens keinen Unterschied, ob ich "%%~A" oder "%%A" übergebe. Einzig %%A funktioniert nicht (wie von euch bereits erläutert wurde).

Der Einzeiler sieht schick aus, aber für meine Zwecke nutze ich dann doch lieber meinen Weg. Habe in dem Pfad nämlich noch mehr zu machen aus diesen einen Link zu löschen. Danke!