Windows Shell - Ordnernamen herausfinden
Dieter Raber
- sonstiges
0 miku0 Vinzenz Mai0 Dieter Raber0 Dieter Raber0 Detlef G.
Hallo,
Ich bin gerade eine Batchdatei am schreiben, meine Kenntnisse sind in diesem Bereich aber eher bescheiden...
Weiss eine Batchdatei, in welchem Verzeichnis sich befindet und gibt es eine Moeglichkeit, Stings zusammenzusetzen?
In PHP wuerde ich das so machen:
<?php
$cwd = dirname(__FILE__);
$otherScript = $cwd . '/the-other-script.php';
Ultimativ ruft eine Batchdatei eine andere Batchdatei auf, die sich im gleichen Verzeichnis befindet. Allerdings wird sie aus einer anderen Working directory aufgerufen.
Um das Scenario etwas deutlicher zu machen, batch_1.cmd und batch_2.cmd befinden sich in c:\batch, working directory ist d:\test
Batch 2:
@echo ich bin Datei 2
Batch 1:
@echo ich bin Datei 1
batch_2.cmd
An der Kommandozeile ist das kein Problem, weil ich weiss, wohin mein cd gehen soll, in der Batchdatei muesste ich das konfigurieren. Das Script wird aber an verschiedene Rechner verteilt, da wuerde ich mir die Konfiguartion gerne sparen.
Gruss
Dieter
Hi,
Weiss eine Batchdatei, in welchem Verzeichnis sich befindet und gibt es eine Moeglichkeit..
set meinpfad = %cd%
echo %meinpfad%
.. St[r]ings zusammenzusetzen?
puh, da bin ich im Moment überfragt, aber evtl. kann man jeden String in eine Variable speichern und dann nacheinander ausgeben lasse.
Grüße
Hallo Dieter,
Weiss eine Batchdatei, in welchem Verzeichnis sich befindet
Nein. Aber sie kann es herausfinden, also war dieser Beitrag nicht umsonst.
und gibt es eine Moeglichkeit, Stings zusammenzusetzen?
Klar:
SET variable=%einevariable%andererText
Ganz wichtig: keine Leerzeichen um das Gleichheitszeichen herum.
Bist Du Dir ganz sicher, dass Du Dir Windows-Batch zumuten willst?
Wie wäre es mit Windows Scripting Host und JScript oder VBScript?
Ich gehe davon aus, dass es Bordmittel sein müssen.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
danke erstmal fuer deine Anregungen!
Das ganze sollte schon Batch sein, weil das in diesem Zusammenhang das einzige ist, was ich einigermassen kann. Und VB ist, wie du ja weisst, ein rotes Tuch fuer mich.
Im Grunde funktioniert das so:
Der Task Scheduler startet dann die Backupsoftware, diese wiederum Batch 1, um anschliessend die den ganzen lokalen Server sowie die gezippten SQL-Dateien auf den Backupserver zu schaufeln.
Viele Gruesse
Dieter
Hallo nochmal
ich habe noch eine Nachfrage. Ich habe das Script aus deinem Posting kopiert und getestet, das Ergebnis ist allerdings nicht das gewuenschte.
Das Script D:\htdocs\test.cmd hat den Inhalt
@ECHO OFF
FOR /F "usebackq delims=/" %%A IN (CD
) DO SET PWD=%%~fA
SET PWD
Working directory ist C:\foo. An der Kommandozeile steht demnach
PS C:\FOO> D:\htdocs\test.cmd
PWD=C:\FOO
Das ist aber meine Working directory, das erwuenschte Ergebnis waere D:\htdocs gewesen, weil die Batchdatei sich dort befindet. Gibt es dafuer eine Loesung?
Viele Gruesse
Dieter
Hallo Dieter
ich habe noch eine Nachfrage. Ich habe das Script aus deinem Posting kopiert und getestet, das Ergebnis ist allerdings nicht das gewuenschte.
Das Script D:\htdocs\test.cmd hat den Inhalt
@ECHO OFF
FOR /F "usebackq delims=/" %%A IN (CD
) DO SET PWD=%%~fA
SET PWD
Du übergibst dem FOR-Befehl die Ausgabe von CD (Parameter /F und „('CD')”) und setzt PWD mit dieser - expandiert als vollständigen Dateinamen („%~fA”).
Du willst aber den Pfad der aktuell ausgeführten Batch-Datei haben.
Das ist aber meine Working directory, das erwuenschte Ergebnis waere D:\htdocs gewesen, weil die Batchdatei sich dort befindet. Gibt es dafuer eine Loesung?
Der Aufruf einer Batch- oder CMD-Datei (ohne Parameter) befindet sich im Parameter 0 (%0). Wenn die CMD-Datei nicht im Path ist, also komplett mit Pfad aufgerufen wird, müsste es so funktionieren:
@echo off
FOR %%A IN (%0) DO SET PWD=%%~dpA
echo %PWD%
Wir füttern FOR nicht mit einer Befehlsausgabe sondern mit dem Inhalt von Parameter 0, dem Programmaufruf selbst, filtern oder erzeugen daraus Laufwerk und Dateiname („%~dpA”) und setzen damit die Umgebungsvariable PWD.
Das funktioniert allerdings nur, wenn die Batch-(CMD-)Datei mit Pfad aufgerufen wird - nicht, wenn sie gefunden wird, weil sie im PATH steht.
Dann könnte allerdings auch eine einfachere Variante ohne extra Umgebungsvariable funktionieren:
@echo off
rem Alles, was du tun willst
%0X
Batch 1 müsste dann z.B. „batch.cmd” heißen und ohne Erweiterung aber mit komplettem Pfad aufgerufen werden und Batch 2 müsste in dem Beispiel „batchX.cmd” heißen.
Auf Wiederlesen
Detlef
Hallo,
Der Aufruf einer Batch- oder CMD-Datei (ohne Parameter) befindet sich im Parameter 0 (%0). Wenn die CMD-Datei nicht im Path ist, also komplett mit Pfad aufgerufen wird, müsste es so funktionieren:
@echo off
FOR %%A IN (%0) DO SET PWD=%%~dpA
echo %PWD%
einfach:
ECHO %~dp0
liefert stets den vollständigen Pfad zum Verzeichnis, in dem sich die Batchdatei befindet, auch wenn sie über die Umgebungsvariable PATH gefunden wurde.
Freundliche Grüße
Vinzenz
Hallo Vinzenz
@echo off
FOR %%A IN (%0) DO SET PWD=%%~dpA
echo %PWD%einfach:
ECHO %~dp0
liefert stets den vollständigen Pfad zum Verzeichnis, in dem sich die Batchdatei befindet, auch wenn sie über die Umgebungsvariable PATH gefunden wurde.
Das echo war nur eine Kontrollausgabe, der Pfad sollte in eine Umgebungsvariable.
Interessant, dass es so funktioniert.
%0 selbst enthält keinen Pfad, wenn die Datei über PATH gefunden wurde. Dass es mit ~dp dann richtig expandiert wird, darauf wäre ich nie gekommen.
Also nochmal komplett:
@echo off
FOR %%A IN (%~dp0) DO SET PWD=%%A
echo Kontrollausgabe: %PWD%
Wenn nur eine zweite Batch-Datei aufgerufen werden soll, dann wäre es so einfacher:
@echo off
rem Alles, was getan werden soll
%~dp0Batch2.cmd
Auf Wiederlesen
Detlef