Dieter Raber: Windows Shell - Ordnernamen herausfinden

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

  1. 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

  2. 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

    1. 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:

      • Batchdatei ruft PHP-Script
      • PHP-Script verbindet sich zu einer MySQL DB und erstellt eine Batchdatei, die fuer alle DBs eine Zeile
           "Pfad\zu\mysqldump.exe" -hhost -uuser -ppassword --add-drop-table --allow-keywords DB  > "Pfad\zu\tmp\DB.sql"
          enthaelt, sowie den Auftrag, am Ende alles zu zippen
      • Batch 1 ruft, wenn PHP ferig ist, Batch 2 auf

      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

    2. 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

      1. 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

        --
        - Wissen ist gut
        - Können ist besser
        - aber das Beste und Interessanteste ist der Weg dahin!
        1. 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

          1. 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

            --
            - Wissen ist gut
            - Können ist besser
            - aber das Beste und Interessanteste ist der Weg dahin!