Wie navigiere ich im Bereich des übergeordneten Ordners ohne vollständigen Pfad?

678
user902300

Gibt es eine Möglichkeit, zu einem Programm zu navigieren, das sich in einem anderen Ordner des übergeordneten Verzeichnisses befindet, ohne den vollständigen Pfad zu verwenden?

Ich habe hier eine Partie:

FOLDER 1\BATCHES\batch1.bat 

welches ein Programm verwendet, das sich in befindet:

FOLDER 1\PROGRAMS\pro.exe 

und meine Charge sieht so aus:

"%SYSTEMDRIVE%\Temp\FOLDER 1\PROGRAMS\pro.exe" --input "%SYSTEMDRIVE%\Temp\FOLDER 1\SCRIPT\script.srpt" --output "%SYSTEMDRIVE%\Temp\FOLDER 1\FILES\myfile.x" 

Wie Sie sehen können %SYSTEMDRIVE%\Temp\, ist es an einem Ort mit so gesperrt, um mein Skript "portabel" zu machen. Gibt es etwas, was ich ersetzen könnte %SYSTEMDRIVE%\Temp\?

Oder mit anderen Worten: Ich möchte alle Vorkommen %SYSTEMDRIVE%\Temp\von meinem Stapel löschen und durch etwas ersetzen, sodass ich, wenn ich meinen FOLDER 1 an einen beliebigen Ort in meinem PC verschiebe, ausgeführt wird

0
".. \ BATCHES \ batch1.bat" Joel Coehoorn vor 5 Jahren 0

2 Antworten auf die Frage

0
LotPings
  • Der Ordner, in dem sich die Charge befindet, kann mit %~dp0(mit einem nachgestellten Backslash) abgerufen werden.
  • Das Dateisystem kümmert sich um relative Ordner, die ..eine Ebene nach oben betreffen .

In tree A: /Fso etwas:

A:. └───Folder 1 ├───BATCHES │ batch1.bat │ ├───FILES │ myfile.x │ ├───PROGRAMS │ pro.exe │ └───SCRIPT script.srpt 

Diese Charge:

:: A:\FOLDER 1\BATCHES\batch1.bat @Echo off Echo batch1 folder is: %~dp0 Echo ====================== for %%A in ("%~dp0..\PROGRAMS\pro.exe") Do set "_Prg=%%~fA" for %%A in ("%~dp0..\SCRIPT\script.srpt") Do set "_Inp=%%~fA" for %%A in ("%~dp0..\FILES\myfile.x") Do set "_Out=%%~fA" Set _  Echo "%_Prg%" --input "%_Inp%" --output "%_Out%" 

wird diese Ausgabe haben:

A:\> "Folder 1\BATCHES\batch1.bat" batch1 folder is: A:\Folder 1\BATCHES\ ====================== _Inp=A:\Folder 1\SCRIPT\script.srpt _Out=A:\Folder 1\FILES\myfile.x _Prg=A:\Folder 1\PROGRAMS\pro.exe "A:\Folder 1\PROGRAMS\pro.exe" --input "A:\Folder 1\SCRIPT\script.srpt" --output "A:\Folder 1\FILES\myfile.x" 
Wenn ich fragen darf, ist ein "% ~ dp0" -Teil mit ganzem "für %% A in" (".... ... Set_" -Teil erforderlich und warum? Ich habe es mit folgendem Befehl versucht: "" \ pro.exe "--input" .. \\ SCRIPT \ script.srpt "--output" .. \\ FILES \ myfile.x "" und der Batch führt alles wie gewünscht aus user902300 vor 5 Jahren 0
Das "for" wird nur verwendet, um den Ausdruck in den doppelten Anführungszeichen aufzulösen. Es funktioniert auch direkt, ist jedoch weniger eindeutig: "A: \ FOLDER 1 \ BATCHES \ .. \ PROGRAMS \ pro.exe" in meinem Beispiel. LotPings vor 5 Jahren 0
Was ich damit meinte war: Ja, ich verstehe Ihre Antwort / Ihren Code. Es ist nur so, dass beide Antworten die Verwendung von "% ~ dp0" auf die eine oder andere Art und Weise erwähnen, also ging es in meiner Frage eher um: Es ist eine Möglichkeit der Wahl "% ~ dp0" oder verliere ich irgendeinen Vorteil, wenn ich darauf verzichte und nur mit "". \\ PROGRAMS \ pro.exe "--input" .. \\ SCRIPT \ script.srpt "--output ".. \\ FILES \ myfile.x" `und sonst nichts user902300 vor 5 Jahren 0
Abhängig vom Kontext `" .. \ PROGRAMS \ pro.exe "--input" .. \ SCRIPT \ script.srpt "--output" .. \ FILES \ myfile.x "` verweist auf das aktuelle Verzeichnis `% CD % `ist nicht notwendigerweise mit dem Stapelpfad identisch. LotPings vor 5 Jahren 0
Ich entschuldige mich, wenn ich nervig bin, aber könnten Sie uns bitte erklären: "** ... könnte sich auf das aktuelle Verzeichnis% CD% beziehen, das nicht notwendigerweise mit dem Stapelpfad identisch ist. **" Ich lese alles und kann das nicht verstehen Punkt user902300 vor 5 Jahren 0
Wenn Sie ein Cmd-Fenster öffnen, wird eine Eingabeaufforderung wie "C: \ Users \ UserName>" angezeigt. In diesem Ordner finden alle Aktionen statt, für die kein anderer Pfad angegeben ist. Wenn Sie einen Stapel mit einem Pfad wie "C: \ Temp \ FOLDER 1 \ BATCHES \ batch1.bat" aufrufen, bleibt das aktuelle Verzeichnis gleich "C: \ Users \ UserName", sodass ein relativer Pfad nicht relativ zum aktuellen Ordner ist in den Ordner, in dem sich der Stapel befindet. LotPings vor 5 Jahren 1
0
JosefZ

Betrachten wir folgendes Szenario:

d:\bat> tree /F "d:\temp\FOLDER 1" Folder PATH listing for volume VolName Volume serial number is ABCD-EFGH D:\TEMP\FOLDER 1 ├───BATCHES │ batch1.bat │ └───PROGRAMS pro.exe 

Verwenden Sie dann den %~dp0Link relativ zum Batch-Skript und den ..relativen Pfad zum übergeordneten Verzeichnis wie im folgenden Skript:

@echo OFF SETLOCAL EnableExtensions echo( echo listing "%~dp0" dir /B /S "%~dp0" echo listing "%~dp0..\programs" dir /B /S "%~dp0..\programs" 

Ausgabe :

d:\bat> "d:\temp\FOLDER 1\BATCHES\batch1.bat"  listing "d:\temp\FOLDER 1\BATCHES\" d:\temp\FOLDER 1\BATCHES\batch1.bat listing "d:\temp\FOLDER 1\BATCHES\..\programs" d:\temp\FOLDER 1\programs\pro.exe  d:\bat> 

Hinweis, die %~dp0..\PROGRAMS unterscheidet sich von der ..\PROGRAMSRegel:

  • %~dp0..\PROGRAMS ist ein Pfad relativ zu dem Verzeichnis, in dem sich der Stapel befindet
    • ( d:\temp\FOLDER 1\BATCHES\im obigen Beispiel)
  • ..\PROGRAMS  ist ein Pfad relativ zum aktuellen Verzeichnis, von dem aus der Stapel gestartet wurde
    • ( d:\bat\im obigen Beispiel)
Wenn ich fragen darf, ist ein Teil "% ~ dp0" mit ganzem "SETLOCAL EnableExtensions ... dir / B / S"% PathToBatch% "... dir / B / S"% PathToBatch% .. \ Programs "` Teil benötigt und warum? Ich habe es mit folgendem versucht: `" .. \\ PROGRAMS \ pro.exe "--input" .. \\ SCRIPT \ script.srpt "--output" .. \\ FILES \ myfile.x "" und die Stapelverarbeitung wird ausgeführt alles wie es soll user902300 vor 5 Jahren 0
Meine Schuld, Entschuldigung. Stellen Sie sich vor "setze" PathToBatch =% ~ dp0 "` (welches _ während des Debugging im Skript vorhanden war). Antwort aktualisiert JosefZ vor 5 Jahren 0
Ich meinte: Was ist der Unterschied zwischen ""% ~ dp0 .. \\ FILES \ myfile.x "` und `" .. \\ FILES \ myfile.x "`? Und warum brauche ich "dir / B / S"? user902300 vor 5 Jahren 0
Der Unterschied wird nun in der aktualisierten Antwort erläutert. Ich habe `dir / B / S"% ~ dp0 .. \ programme "verwendet, nur um _ das Ergebnis anzuzeigen _ von` .. 'in einer Pfadangabe. SuperUser ist kein kostenloser Scripting-Service, daher können Sie nicht immer eine narrensichere Lösung erwarten. JosefZ vor 5 Jahren 0