2010-03-07 7 views
12

Ich brauche den Namen des übergeordneten Verzeichnisses für eine Datei in DOS findenMutterverzeichnisname für eine bestimmte Datei Get mit DOS Batch-Scripting

für ex.

Angenommen, dies ist das Verzeichnis

C:\test\pack\a.txt 

ich ein Skript, das mir den Dateinamen der Datei zurückgeben sollte

C:\\>getname.bat  
enter file name: c:\test\pack\a.txt 

jetzt der Name des Skriptes nur die Eltern fragt.

pack   

und NICHT den gesamten übergeordneten Pfad zur Datei.

c:\test\pack 

Antwort

9

siehe this Frage

@echo OFF 
set mydir="%~p1" 
SET mydir=%mydir:\=;% 

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i 
goto :EOF 

:LAST_FOLDER 
if "%1"=="" (
    @echo %LAST% 
    goto :EOF 
) 

set LAST=%1 
SHIFT 

goto :LAST_FOLDER
+0

Danke .. U Genie r :) .. funktioniert perfekt –

+0

Ich sehe nicht, wie das funktionieren kann. % ~ p1 funktioniert nicht für mich. Es funktioniert nur mit% ~ dp0 oder% ~ p0. – djangofan

+0

@djangofan Das Skript nimmt einen Pfad als Argument und gibt den Verzeichnisnamen des Pfades zurück. – asdfg

1

Sie Vbscript verwenden können, zB die unten als getpath.vbs

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFile = objArgs(0) 
WScript.Echo objFS.GetParentFolderName(strFile) 

dann auf der Kommandozeile oder in Batch speichern Sie diese

C:\test>cscript //nologo getpath.vbs c:\test\pack\a.txt 
c:\test\pack 

Wenn Sie eine Stapelmethode wünschen, können Sie sich for /? ansehen.

%~fI  - expands %I to a fully qualified path name 
    %~dI  - expands %I to a drive letter only 
    %~pI  - expands %I to a path only 
10

Die erste Antwort oben funktioniert nicht, wenn der Name des übergeordneten Verzeichnisses ein Leerzeichen enthält. Die folgenden Werke:

@echo off 
setlocal 

set ParentDir=%~p1 
set ParentDir=%ParentDir: =:% 
set ParentDir=%ParentDir:\= % 
call :getparentdir %ParentDir% 
set ParentDir=%ParentDir::= % 

echo ParentDir is %ParentDir% 
goto :EOF 

:getparentdir 
if "%~1" EQU "" goto :EOF 
Set ParentDir=%~1 
shift 
goto :getparentdir 

die oben Aufruf mit dem Parameter von "C: \ Temp \ Elternteil Dir Mit Platz \ myfile.txt" gibt folgende:

>GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt" 
ParentDir is Parent Dir With Space 

Die oben genannten Arbeiten von Räumen mit Doppelpunkte ersetzen (Diese sollten nicht in Windows-Pfaden vorhanden sein). Dann werden Verzeichnistrennzeichen durch Leerzeichen ersetzt, so dass einzelne Verzeichnisse an getparentdir als separate Argumente übergeben werden. Funktion getparentdir loops, bis es sein letztes Argument findet. Schließlich werden alle Doppelpunkte im Ergebnis durch Leerzeichen ersetzt.

+0

ist es möglich, dies für Dateinamen mit Kommas funktionieren zu lassen? Sonderfall ich weiß, nur wundernd, ob es eine einfache Ergänzung oder eine Menge zusätzlichen Code wäre. danke – GeorgeCostanza

1

Hier ist ein Weg, der nicht verwendet CALL und ich glaube, ist schneller.Based on jeb's splitting function (möglicherweise fehl, wenn der Verzeichnisname ! enthält):

@echo off 

set "mydir=%~p1" 
SET mydir=%mydir:~0,-1% 

setlocal EnableDelayedExpansion 
set LF=^ 


rem ** Two empty lines are required 

for %%L in ("!LF!") DO (
    set "dir_name=!mydir:\=%%L!" 
) 
for /f "delims=" %%P in (""!dir_name!"") do set "dn=%%~P" 
echo %dn% 

exit /b 0 
+0

das funktioniert super. Gibt es eine einfache Möglichkeit, Sonderfälle für Ausrufezeichen hinzuzufügen, oder ist DOS-Skripting zu begrenzt? – GeorgeCostanza

0

Hier ist eine andere Lösung:

SET LAST=%CD% 
SET PARENTNAME=NONE 
cd /D C:\test\pack 
FOR %%I in (%CD%) do SET PARENTNAME=%%~nI 
cd /D %LAST% 
ECHO %PARENTNAME% 

%% ~ nI: '~ n' extrahiert Namen Pfad in %% I Variable gespeichert
cd: ‚/ D‘ Parameter hinzugefügt zwischen den Scheiben auch

1

ich fand diese Kombination von Ansätzen aus den Antworten von djangofan und paranoid zu sein, sowohl, einfach und perfekt s wechseln ufficient, wenn mein Skript übergeordnetes Verzeichnis aufzuzublicken:

set FULL_PATH=%~dp0 
set FULL_PATH=%FULL_PATH:~1,-1% 
for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 
echo %PARENT_FOLDER% 

Da Sie stattdessen auf Benutzereingaben arbeiten mag, haben Sie einige minimale zusätzliche Arbeit zu tun, rechtliche Variationen wie C zu handhaben: \ foo \ bar \ a. txt vs. C: \ foo \ bar \ a.txt oder c: /foo/bar/a.txt. Dies könnte dann für Sie arbeitet:

@setlocal 
@echo off 

call:GET_PARENT_FOLDER C:\foo\bar\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER C:\foo\bar\\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER c:/foo/bar/a.txt 
echo %PARENT_FOLDER% 

pause 
goto:EOF 

:GET_PARENT_FOLDER 
:: Strip the filename, so we get something like this: 'C:\foor\bar\' 
set "_FULL_PATH=%~dp1" 

:: Strips all dangling '\' and '/' in a loop, so the last folder name becomes accessible 
:_STRIP 
if not "%_FULL_PATH:~-1%"=="\" if not "%_FULL_PATH:~-1%"=="/" goto:_STRIP_END 
set "_FULL_PATH=%_FULL_PATH:~1,-1%" 
goto:_STRIP 
:_STRIP_END 

:: We need the context of a for-loop for the special path operators to be available 
for %%i in ("%_FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 

goto:EOF 
7

Es kann sehr einfach sein, den übergeordneten Ordner der Batch-Datei zu erhalten:

@echo off 
for %%a in ("%~dp0\.") do set "parent=%%~nxa" 
echo %parent% 

Und für einen Elternteil eines Dateipfades nach der Frage:

@echo off 
for %%a in ("c:\test\pack\a.txt") do for %%b in ("%%~dpa\.") do set "parent=%%~nxb" 
echo %parent% 
+0

Ich fand das nützlich, um einen übergeordneten Ordner zu finden, der ein Paar Verzeichnisse über der Batch-Datei war. Fügen Sie einfach '\ ..' nach dem '% ~ dp0 \ .' hinzu, um auf eine Ordnerebene zu gelangen. Beispiel: 'für %% a in ("% ~ dp0 \. \ .. \ .. \ .. ") setze" parent = %% ~ nxa "' – Toomaja

1

Die Idee von DaDummy ausgearbeitet in praktischere wiederverwendbare Funktionen. Auch das erste Zeichen von _full_path ist jetzt enthalten.

set map=D:\test1\test2\test3\test4.txt 
call:get_parent_path "%map%" 
echo full_path is %_full_path% 
call:get_parent_path %_full_path% 
echo full_path is %_full_path% 
call:get_last_path %_full_path% 
echo last_path is %_last_path% 
goto :eof 

:get_parent_path 
set "_full_path=%~dp1" 
:_strip 
if not "%_full_path:~-1%"=="\" if not "%_full_path:~-1%"=="/" goto:_strip_end 
set "_full_path=%_full_path:~0,-1%" 
goto:_strip 
:_strip_end 
exit /b 

:get_last_path 
set "_last_path=%~nx1" 
exit /b 

::result: 
::full_path is D:\test1\test2\test3 
::full_path is D:\test1\test2 
::last_path is test2