Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch - Ändern der Umgebungsvariable PATH

Frage Entwicklung Batch & Shell

Mitglied: Viprex

Viprex (Level 1) - Jetzt verbinden

20.05.2009, aktualisiert 12:54 Uhr, 37641 Aufrufe, 26 Kommentare, 2 Danke

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:
01.
@for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set x=%%i 
02.
@echo %x%
2. Konkatenieren des Inhaltes von x mit dem hinzuzufügenden Pfad:
01.
set neu=%x%;MeinPfad
3. Zurückschreiben der Variablen in die Registry:
01.
@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

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!
Mitglied: 78632
20.05.2009 um 14:11 Uhr
Zitat von Viprex:
2. Konkatenieren des Inhaltes von x mit dem hinzuzufügenden
Pfad:

geht so:
01.
set path="X:\Mein neuer Pfad";%path%
Es stört auch nicht, wenn der Pfad bereits vorhanden war. 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.
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.
Bitte warten ..
Mitglied: LotPings
20.05.2009 um 14:11 Uhr
Hallo Viprex,

meine Behelfslösung sieht so aus:

01.
Set NeuerPfad=C:\Irgendwas 
02.
For %%A in ("%PAth:;=" "%") do if /i %%A=="%NeuerPfad%" echo Pfad schon enthalten
Gruß
LotPings
Bitte warten ..
Mitglied: Viprex
20.05.2009 um 15:34 Uhr
Zitat von 78632:
01.
> set path="X:\Mein neuer Pfad";%path% 
02.
> 
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.
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.
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 LotPings:
01.
> Set NeuerPfad=C:\Irgendwas 
02.
> For %%A in ("%PAth:;=" "%") do if /i %%A=="%NeuerPfad%" echo Pfad schon enthalten 
03.
> 
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.
01.
@for /f "tokens=3" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set x=%%i  
02.
@echo %x%
Bitte warten ..
Mitglied: 78632
20.05.2009 um 16:03 Uhr
Zitat von Viprex:
> Zitat von 78632:
> Es stört auch nicht, wenn der Pfad bereits vorhanden war.

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.


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.
Bitte warten ..
Mitglied: LotPings
20.05.2009 um 16:06 Uhr
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.
01.
@for /f "tokens=2*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j" 
02.
@echo %x%
Gruß
LotPings
Bitte warten ..
Mitglied: Viprex
20.05.2009 um 19:09 Uhr
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.
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


Zitat von LotPings:
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.
01.
> @for /f "tokens=2*" %%i in ('reg query 
02.
> "HKLM\SYSTEM\CurrentControlSet\Control\Session 
03.
> Manager\Environment" /v Path') do @Set "x=%%~j" 
04.
> @echo %x% 
05.
> 

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 (~)?
Bitte warten ..
Mitglied: LotPings
20.05.2009 um 21:23 Uhr
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.

01.
@for /f "tokens=2*" %%i in ('reg query 
02.
"HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path') do @Set "x=%%~j" 
03.
@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
Bitte warten ..
Mitglied: Viprex
23.05.2009 um 12:14 Uhr
Zitat von LotPings:
Im Prinzip schon. HAST DU DIE AUSGABE VON Set /? GELESEN?
Da steht das alles drin.

Sorry. Ja, Jetzt, ja 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.
Bitte warten ..
Mitglied: 78632
23.05.2009 um 12:20 Uhr
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
Bitte warten ..
Mitglied: Viprex
23.05.2009 um 12:34 Uhr
Ja, das habe ich mir eben beim Lesen auch gedacht. Im Code stehts ja auch richtig
Bitte warten ..
Mitglied: LotPings
23.05.2009 um 12:54 Uhr
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
Bitte warten ..
Mitglied: Viprex
02.06.2009 um 14:38 Uhr
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
01.
  
02.
@echo off 
03.
Set AlterPfad=C:\Mein Pfad 
04.
Set NeuerPfad= 
05.
 
06.
For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" call :Blimblim %%~A 
07.
goto end 
08.
 
09.
:Blimblim 
10.
@set "NeuerPfad=%NeuerPfad%;%%~A 
11.
goto :eof 
12.
 
13.
:end 
14.
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
01.
  
02.
@echo off 
03.
Set AlterPfad=C:\Mein Pfad 
04.
Set NeuerPfad= 
05.
 
06.
For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" @set "NeuerPfad=%NeuerPfad%;%%~A" 
07.
goto end 
08.
 
09.
:end 
10.
echo %NeuerPfad%

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

Freue mich auf eure Antworten.

Vielen Dank,
Tim
Bitte warten ..
Mitglied: 78632
02.06.2009 um 14:50 Uhr
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:
01.
@echo off & setlocal EnableDelayedExpansion 
02.
Set AlterPfad=C:\Mein Pfad 
03.
Set NeuerPfad= 
04.
 
05.
For %%A in ("%Path:;=" "%") do if /i not %%A=="%AlterPfad%" @set "NeuerPfad=!NeuerPfad!%%~A;" 
06.
goto end 
07.
 
08.
:end 
09.
echo %NeuerPfad% 
10.
pause
Pause kannst du ja dann wegnehmen, wenn du das Ergebnis für gut befindest.
Bitte warten ..
Mitglied: Viprex
02.06.2009 um 14:59 Uhr
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?
Bitte warten ..
Mitglied: 78632
02.06.2009 um 15:02 Uhr
Wenn die möglicherweise doppelten ;; am Ende der neuen Path-Variablen stören sollten, kannst du 1 wegnehmen:
01.
:end 
02.
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
Bitte warten ..
Mitglied: Viprex
02.06.2009 um 15:25 Uhr
Zitat von 78632:
Wenn die möglicherweise doppelten ;; am Ende der neuen
Path-Variablen stören sollten, kannst du 1 wegnehmen:
01.
> :end 
02.
> Set NeuerPfad=%NeuerPfad:~0,-1% 
03.
> 
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


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

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

Nochmal vielen Dank für die schnelle Hilfe!
Bitte warten ..
Mitglied: 78632
02.06.2009 um 15:51 Uhr
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
01.
:end 
02.
Set NeuerPfad=%NeuerPfad:~1% 
lösen
Bitte warten ..
Mitglied: Viprex
03.06.2009 um 13:39 Uhr
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

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

01.
@echo off 
02.
For /f "delims==" %%A in ('Dir "C:\Dokumente und Einstellungen\*.*" /b') do call :DeleteCopyLNK "%%~A" 
03.
goto end 
04.
 
05.
:DeleteCopyLNK 
06.
set full=%1 
07.
set full=%full:~1,-1% 
08.
@set Pfad=%systemdrive%\Dokumente und Einstellungen\%full%\Desktop 
09.
@del /F /Q "%Pfad%\test.lnk" 
10.
goto :eof 
11.
 
12.
:end 
13.
pause
Meine Fragen:
Wenn ich
01.
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.
Bitte warten ..
Mitglied: 78632
03.06.2009 um 15:36 Uhr
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.

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):
01.
For /f "delims==" %%A in ('Dir "C:\Dokumente und Einstellungen\test.lnk" /b /s') do del "%%A" 
Bitte warten ..
Mitglied: LotPings
03.06.2009 um 16:21 Uhr
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.
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
Bitte warten ..
Mitglied: Viprex
03.06.2009 um 16:50 Uhr
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?
Bitte warten ..
Mitglied: 78632
03.06.2009 um 16:53 Uhr
@LotPings
Stimmt, haste Recht.

Ich hatte die Zeile 07 aus seinem Script betrachtet.
Bitte warten ..
Mitglied: LotPings
03.06.2009 um 16:57 Uhr
Zeile 06 aus deinem Beispiel so ändern:

01.
Set "Full=%~1"
Gruß
LotPings

Edit und Zeile 07 raus
Bitte warten ..
Mitglied: 78632
03.06.2009 um 17:05 Uhr
"%%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"
Bitte warten ..
Mitglied: Viprex
03.06.2009 um 18:10 Uhr
Zitat von LotPings:
Zeile 06 aus deinem Beispiel so ändern:

01.
> Set "Full=%~1" 
02.
> 
Gruß
LotPings

Edit und Zeile 07 raus

Ok, danke! Das ist ja nochmal eine Zeile weniger 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!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Datum per batch ändern in Tagen (2)

Frage von crawnby zum Thema Batch & Shell ...

IDE & Editoren
gelöst IP und DNS per Batch ändern (9)

Frage von andyw5 zum Thema IDE & Editoren ...

Windows Netzwerk
gelöst Java über Gruppenrichtlinie - Umgebungsvariable PATH erweitern (4)

Frage von Juckie zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...