Wie prüfe ich, ob sich die aktuelle Batchdatei in einem bestimmten Ordner befindet?

614
Mantis Tsai

Hallo, ich bin relativ neu für Batch-Dateien. Tut mir leid, wenn diese Frage dumm erscheint, aber ich brauche wirklich Hilfe.

Ich brauche also mein Batch-Skript, um zu überprüfen, ob es sich in einem bestimmten Ordner befindet, %userprofile%\Desktopbeispielsweise. Ich möchte nicht, dass es sich um den eigenen Dateinamen kümmert. Ich habe absolut keine Ahnung, wo ich anfangen soll. Ich weiß, wie man den aktuellen Pfad / Dateinamen usw. erhält, aber das ist alles, was ich weiß. Wie kann ich das Programm den aktuellen Pfad mit dem Pfad vergleichen, den ich sehen möchte, wenn er sich befindet? Oder gibt es eine andere effizientere Methode?

Was ich erreichen möchte, ist so:

if this file is in Desktop folder( echo It's here )else( echo It's not here ) 

Jede Hilfe wird geschätzt, vielen Dank

4
Haben Sie das Echo% cd% geprüft? user648026 vor 6 Jahren 0
https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file user648026 vor 6 Jahren 1
@ user648026% cd% zeigt nicht den Pfad der Batchdatei an, sondern nur das aktuelle Verzeichnis. Der aktuelle Pfad ist so etwas wie% ~ p0, aber ich habe die genaue Syntax vergessen. LPChip vor 6 Jahren 1
Siehe Link: https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file user648026 vor 6 Jahren 0
Mögliches Duplikat von [Aktuellen Ordnernamen über einen DOS-Befehl abrufen?] (Https://superuser.com/questions/160702/get-current-folder-name-by-a-dos-command) LPChip vor 6 Jahren 0
Mein Hauptproblem war das Vergleichen der Wege, aber danke Jungs Mantis Tsai vor 6 Jahren 0

2 Antworten auf die Frage

2
Vlastimil Ovčáčík

Sie müssen sich nicht entschuldigen, da die von Ihnen aufgeworfene Frage schwieriger ist, als Sie wahrscheinlich erwarten.

Lösung

So können Sie testen, ob sich Ihre Stapeldatei in einem bestimmten Ordner befindet, in Ihrem Fall im Desktop-Ordner:

@echo off  :: Normalize this batch script's path set BATCH_PATH=%~dp0 set BATCH_PATH=%BATCH_PATH:~0,-1%  :: Test for equality if "%BATCH_PATH%"=="%USERPROFILE%\Desktop" ( echo This file is on Desktop. ) else ( echo This file is not on Desktop. ) 

Dinge zu beachten

  • Eine alternative Möglichkeit, den Pfad (und meinen Favoriten) zu normalisieren, ist:

    pushd "%~dp0" set BATCH_PATH=%CD% popd 
    • In jedem Fall möchten Sie wahrscheinlich das Nachlaufen entfernen. Dies \ist eine der Aktionen, die die Normalisierung für Sie leistet
  • Verwenden Sie %~dp0stattdessen die Variable %cd%, da die letzte Semantik der Ordner ist, in dem Ihre Skripts ausgeführt werden, während sich der erste Ordner in dem Ordner befindet, in dem sich Ihr Skript befindet (was Sie verlangt haben).

    • %0 gibt Ihnen den Speicherort Ihres Batch-Skripts
    • Durch das Hinzufügen dp(dh %dp0) fragen Sie nach Datenträger und Pfad, der den Dateinamen und die Erweiterung weglässt (was in etwa example.batder Fall ist und im nächsten Schritt eine Belastung darstellen würde - Gleichheitsprüfung).
    • indem ~Sie hinzufügen, dass Sie aufgefordert werden, eventuell geöffnete oder schließende Objekte zu entfernen "(dh der Pfad enthält Leerzeichen)
  • Pfade werden eingeschlossen ", um Fehler aufgrund von möglichem Speicherplatz in der Pfadzeichenfolge zu vermeiden


Nicht so einfach, wie man dachte, oder?

Dank der Antwort und der Klarstellung zu% dp /% cd%. Ich habe beim Spielen jedoch etwas bemerkt. Wenn ich% USERPROFILE% \ Desktop durch C: \ ProgramData \ Microsoft \ Windows \ Startmenü \ Programme ersetze \ StartUp (allgemeiner Startordner) Es scheint den Code auf jeden Fall auszuführen. Mache ich etwas falsch? Mantis Tsai vor 6 Jahren 0
Bitte schön. Das Skript funktioniert für mich richtig, wenn ich den Ordner `StartUp` teste. Ich würde mehr Details benötigen - insbesondere den Code, was er macht und was Sie davon erwarten. Vlastimil Ovčáčík vor 6 Jahren 0
Außerdem gibt es jetzt zwei Startordner: a) `C: \ ProgramData \ Microsoft \ Windows \ Startmenü \ Programme \ Start 'und b)` C: \ Users \ Admin \ AppData \ Roaming \ Microsoft \ Windows \ Startmenü \ Programme \ Startup`. Vlastimil Ovčáčík vor 6 Jahren 0
Ich habe den Code aus der Antwort unten verwendet (ich sehe keinen Unterschied, außer dass seine Antwort den Pfad nicht als Variable festgelegt hat). Es funktioniert für alle Ordner, die ich getestet habe, mit Ausnahme der Startordner. Mantis Tsai vor 6 Jahren 0
Mein Code: `@echo off IF% ~ dp0 ==% USERPROFILE% \ Desktop \ (ECHO Es ist hier) ELSE (ECHO Es ist nicht hier) IF% ~ dp0 ==% USERPROFILE% \ AppData \ Roaming \ Microsoft \ Windows \ Start Menü \ Programme \ Startup \ (ECHO Es ist hier) ELSE (ECHO Es ist nicht hier) WENN% ~ dp0 == C: \ ProgramData \ Microsoft \ Windows \ Startmenü \ Programme \ StartUp \ (ECHO Es ist hier) ELSE (ECHO Es ist nicht hier) pause " Mantis Tsai vor 6 Jahren 0
Es kehrt zurück: Es ist hier Es ist nicht Hier Es ist nicht Hier, wenn ich es auf den Desktop lege Mantis Tsai vor 6 Jahren 0
Ich sehe und bekomme die gleiche Ausgabe wie Sie. Der Grund dafür ist, dass der Gleichheitstest in ** die letzten beiden ist, wenn die Anweisungen ** fehlerhaft sind und beide Blöcke ** if ** und ** else ** ausgeführt werden. Das erste * if * ist in Ordnung. Der Grund dafür ist, dass der Pfad zum `Startup'-Ordner Platz enthält und Sie / Art den Pfad nicht in doppelte Anführungszeichen gesetzt haben. Vlastimil Ovčáčík vor 6 Jahren 0
Richtig, ich habe vergessen, das hinzuzufügen. Ich habe die Anführungszeichen hinzugefügt und das Programm funktioniert jetzt! Danke für all die Hilfe :) Mantis Tsai vor 6 Jahren 0
0
Art Gertner

Minimales Arbeitsbeispiel mit %cd%:

IF %cd%==%userprofile%\Desktop ( ECHO It's here ) ELSE ( ECHO It's not here ) 

Zwischenvariable verwenden:

FOR /F "tokens=*" %%a in ('cd') do SET CURRENT_DIR=%%a IF %CURRENT_DIR%==%userprofile%\Desktop ( ECHO It's here ) ELSE ( ECHO It's not here ) 

Da Sie sagten, Sie hätten keine Ahnung, wo Sie anfangen sollen, finden Sie hier eine gute Lektüre: https://en.wikibooks.org/wiki/Windows_Batch_Scripting

-1, das beantwortet die Frage nicht. LPChip vor 6 Jahren 1
Dies hat mein Problem (vorerst) gelöst und danke für den Link! Ich werde sicher nachlesen. Aber einige Quellen sagen, dass es einen Unterschied zwischen% cd% und% ~ dp0 gibt, wobei die erste manchmal einen anderen Pfad hat? Ich bin etwas verwirrt Mantis Tsai vor 6 Jahren 1
Diese Antwort wurde zu einem bestimmten Zeitpunkt geschrieben, dass nicht klar war, ob Mantis nach der Lösung% cd% oder% dp0 fragt. Der Fragetitel forderte nach dem Dateipfad des Skripts, der Fragentext zitierte jedoch zweimal "Aktuelles Verzeichnis" und wurde mit "Arbeitsverzeichnis" gekennzeichnet. Daher die Verwirrung. Vlastimil Ovčáčík vor 6 Jahren 2