Batch Script: Flag?

Vielen lieben Dank an alle die mir hier geschrieben haben. HAbe das Problem mittlerweile lösen können. Nun habe ich aber schon eine andere Frage:

Im code steht das:
Code:
set ToolDir=%~dp0

Wenn ich die Kollegen von stackoverflow durchschaue stoße ich auf das hier: https://stackoverflow.com/questions/5034076/what-does-dp0-mean-and-how-does-it-work

Ein bisschen runterscrollen findet man eine kurz Erklärung für dieses ~dp0. 100%ig verstehen tue ich aber nicht, was die da meinen.
 
%0 ist die Batchdatei selbst, also Dateiname etc.
%1 ist der erste Parameter des Aufrufs
%2 ist der zweite ... usw

Wenn ein Parameter ein Pfad ist - %0 ist es in jedem Fall - kann man mit Hilfe von Modifikatoren davor nur bestimmte Teile des Pfades auslesen. %~dp0 besagt in dem Fall, dass vom vollständigen Pfad zur Batch inkl. Dateiname und Erweiterung nur Laufwerk und Order genommen werden sollen. Damit ermittelt man also den Speicherort der Batchdatei.

%~nx0 wäre Dateiname + Erweiterung und %~dpnx0 müsste, wenn ich mich nicht irre, dasselbe wie %0 ausspucken
 
  • Gefällt mir
Reaktionen: mae1cum77
Der Vollständigkeit halber sei erwähnt, daß %~dp0 immer mit einem '\' ended. Darauf muß bei Nutzung geachtet werden. Vollständige Pfadangabe zu einer Datei in diesem Ordner wäre %~dp0datei.exe oder im obigen Fall %ToolDir%datei.exe.

Beispiel:
Code:
@echo off
set dir=%~dp0
set file=%~dp0kartenhistory.log
echo %dir%
echo %file%
pause

ergibt als Output:
Code:
M:\Test\
M:\Test\kartenhistory.log
 
  • Gefällt mir
Reaktionen: Raijin
Man muss nicht zwingend darauf achten. In meiner eigenen Unachtsamkeit hatte ich früher häufig set file=%~dp0\kartenhistory.log benutzt und zumindest in meinen Batches funktionierte es fehlerfrei. Heutiges CMD (min. ab Win10) ist tolerant gegenüber Doppel-Backslashes.

Aber klar, wenn es ordentlich sein soll, dann sollte man es so umsetzen, wie du es geschrieben hattest. :daumen:

Jetzt nach längerem nachdenken: Ich könnte mir auch vorstellen, dass die Doppel-"\" Probleme machen könnten, wenn ich solch einen Pfad in einer FOR-Schleife (z.B. Zerlegung des Pfades) verarbeiten möchte.
 
  • Gefällt mir
Reaktionen: mae1cum77
Darkman.X schrieb:
Aber klar, wenn es ordentlich sein soll, dann sollte man es so umsetzen, wie du es geschrieben hattest.
Hat wenig mit ordentlich zu tun, geht eher darum potentielle Fehler von vornherein auszuschließen.

Ich schneide in dem Fall immer das letzte Backslash ab (set ToolDir=%ToolDir:~0,-1%) und setze das bei Bedarf an entsprechender Stelle selbst.
 
  • Gefällt mir
Reaktionen: Raijin und Darkman.X
Gute Ergänzung @mae1cum77 , danke dafür.


mae1cum77 schrieb:
Ich schneide in dem Fall immer das letzte Backslash ab
So mach ich das auch @mae1cum77 , weil ich verkette Pfade mit Variablen ohne erkennbare backslahes nicht ausstehen kann und als schlecht lesbar empfinde und backslah-Fehler fallen leicht unter den Teppich, weil man sich nie so richtig sicher ist ob da nu einer ist oder nicht. Ich nutze dafür allerdings eine kleine Funktion, die ich per CALL aufrufe und die explizit nur das \ am Ende entfernt - wenn da eines steht. Bin leider die Woche ohne Zugang zu PC und kann das snippet leider nicht posten. Vom Prinzip her ist da aber nur ein if == \ davor, um nicht ungewollt Teile des bereits korrekten Pfads zu löschen ;)


%pfad%\%ordner%\%datei%

sieht einfach "richtiger" aus als

%pfad%%ordner%%datei%

Zudem muss man ja auch bedenken, dass ein Pfad womöglich als Parameter beim Aufruf übergeben wird und dabei beliebig mit/ohne sein kann.
 
  • Gefällt mir
Reaktionen: mae1cum77
Raijin schrieb:
Vom Prinzip her ist da aber nur ein if == \ davor, um nicht ungewollt Teile des bereits korrekten Pfads zu löschen
Ist nach Verwendung von %~dp0 zwar unnötig aber generell sollte
Code:
if "%ToolDir:~-1%"=="\" set ToolDir=%ToolDir:~0,-1%
das lösen.
 
  • Gefällt mir
Reaktionen: Raijin
Ich sag ja, ich nutze das für alle Pfade, auch für jene, die man als Parameter mitgibt. Da kommt je nach Anwender mal ein \ mit, mal nicht - auch wenn ICH der Anwender bin :freak:

Aber ungefähr so sieht das bei mir aus, ja. :daumen:
 
  • Gefällt mir
Reaktionen: mae1cum77
Ich hab jetzt noch ein weiteres Problem: Das Script kann anscheinend an einen bestimmten Ort nicht schreiben. Es handelt sich hierbei um ein Server-Laufwerk. Wenn ich mit dem Explorer auf dieses Laufwerk zugreife, kann ich aber schreiben. Das logfile das erstellt wird, sagt, dass "Output folder is Read Only at this path: "X:\test\test\test... Please use a different folder with write access."
 
Wir rufst du die Batch auf? Eingabeaufforderung? Doppelklick? Taskplaner? Oder womöglich remote per psexec?
 
Einfach in der eingabeaufforderung. Problem: Das Batch lief bisher nur auf Windows 10 Rechnern. Ich soll das Zeug jetzt auf Windows 11 zum Laufen bringen.
 
Zurück
Oben