me encontré con esta combinación de enfoques de las respuestas de djangofan y paranoico a ser a la vez, sencillo y perfectamente s ufficient, al mirar para arriba directorio padre de mi guión:
set FULL_PATH=%~dp0
set FULL_PATH=%FULL_PATH:~1,-1%
for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni"
echo %PARENT_FOLDER%
Puesto que usted quiere trabajar en la entrada del usuario en su lugar, usted tiene que hacer un trabajo adicional mínimo, para manejar las variaciones legales como C: \ foo \ bar \ a. txt vs. C: \ foo \ bar \ a.txt o c: /foo/bar/a.txt. Esto podría luego trabajar para usted:
@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
Gracias .. U r genio :) .. funciona perfectamente –
no veo la forma en que se puede trabajar. % ~ p1 no funciona para mí. Solo funciona con% ~ dp0 o% ~ p0. – djangofan
@djangofan El script toma una ruta como argumento y devuelve el nombre del directorio de la ruta. – asdfg