2010-03-07 10 views

Répondre

9

voir this question

@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

Merci .. U r génie :) .. fonctionne parfaitement –

+0

je ne vois pas comment cela peut fonctionner. % ~ p1 ne fonctionne pas pour moi. Cela ne fonctionne qu'avec% ~ dp0 ou% ~ p0. – djangofan

+0

@djangofan Le script prend un chemin en argument et retourne le nom du répertoire du chemin. – asdfg

1

vous pouvez utiliser un script VBScript, par exemple, enregistrer le ci-dessous comme getpath.vbs

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

puis sur la ligne de commande ou dans votre lot, faire

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

Si vous voulez une méthode par lots, vous pouvez regarder for /?.

%~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

La première réponse ci-dessus ne fonctionne pas si le nom du répertoire parent contient un espace. Les travaux suivants:

@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 

Appel ci-dessus avec le paramètre de "C: \ Temp \ Parent Dir Avec l'espace \ myfile.txt" donne ce qui suit:

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

Les travaux ci-dessus en remplaçant les espaces par des colons (ceux-ci ne devraient pas exister dans les chemins Windows), puis en remplaçant les délimiteurs de répertoire par des espaces afin que les répertoires individuels soient passés à getparentdir en tant qu'arguments séparés. La fonction getparentdir boucle jusqu'à trouver son dernier argument. Enfin, tous les deux-points dans le résultat sont remplacés par des espaces.

+0

est-il possible de faire ce travail pour les noms de fichiers qui incluent des virgules? cas particulier je sais, je me demandais juste si ce serait un ajout simple ou beaucoup de code supplémentaire. merci – GeorgeCostanza

1

Voici une manière qui n'utilise pas CALL et je crois que c'est plus rapide.Based on jeb's splitting function (peut échouer si le nom du répertoire contient !):

@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

cela fonctionne très bien. Existe-t-il un moyen simple d'ajouter des cas spéciaux pour les points d'exclamation, etc., ou les scripts DOS sont-ils trop limités? – GeorgeCostanza

0

Voici une autre solution:

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' extrait de nom chemin stocké dans %% variable I
cd: paramètre «/D » ajouté pour basculer entre les disques aussi

1

J'ai trouvé cette combinaison d'approches des réponses de djangofan et paranoïaque être à la fois, simple et parfaitement s ufficient, lors de la recherche dans le répertoire parent de mon script:

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

Puisque vous voulez travailler sur l'entrée d'utilisateur à la place, vous devez faire un travail supplémentaire minime, pour gérer les variations juridiques comme C: \ foo \ bar \ a. txt vs. C: \ foo \ bar \ a.txt ou c: /foo/bar/a.txt. Cela pourrait alors travailler pour vous:

@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

Il peut être très simple pour obtenir le dossier parent du fichier batch:

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

Et pour un parent d'un chemin de fichier selon la question:

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

J'ai trouvé cela utile pour trouver un dossier parent qui était un couple de répertoires au-dessus du fichier de commandes. Ajoutez juste '\ ..' après le '% ~ dp0 \ .' pour remonter au niveau du dossier. Exemple: 'pour %% a ("% ~ dp0 \. \ .. \ .. \ .. ") définissez" parent = %% ~ nxa "' – Toomaja

1

L'idée de DaDummy a fonctionné dans des fonctions réutilisables plus pratiques. Aussi le premier caractère du _full_path est maintenant inclus.

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 
Questions connexes