Мне нужен путь к папке, содержащей cmd файл. С% 0 я могу получить имя файла. Но как получить имя папки?
c:\temp\test.cmd → test.cmd
P.S. Моя текущая директория!= Папка script.
Мне нужен путь к папке, содержащей cmd файл. С% 0 я могу получить имя файла. Но как получить имя папки?
c:\temp\test.cmd → test.cmd
P.S. Моя текущая директория!= Папка script.
Для имени папки и диска вы можете использовать:
echo %~dp0
Вы можете получить гораздо больше информации с помощью разных модификаторов:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
The modifiers can be combined to get compound results:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
Это скопировать копию из "for/?" команды в командной строке. Надеюсь, что это поможет.
Топ-10 советов DOS Batch (Да, DOS Batch...) показывает batchparams.bat (ссылка на источник как суть):
C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1 = c:\windows\notepad.exe
%~f1 = c:\WINDOWS\NOTEPAD.EXE
%~d1 = c:
%~p1 = \WINDOWS\
%~n1 = NOTEPAD
%~x1 = .EXE
%~s1 = c:\WINDOWS\NOTEPAD.EXE
%~a1 = --a------
%~t1 = 08/25/2005 01:50 AM
%~z1 = 17920
%~$PATHATH:1 =
%~dp1 = c:\WINDOWS\
%~nx1 = NOTEPAD.EXE
%~dp$PATH:1 = c:\WINDOWS\
%~ftza1 = --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE
Принятый ответ полезен, но не сразу становится очевидным, как получить имя файла из пути, если вы НЕ используете переданные значения. Я смог обработать это из этой темы, но если другим не повезло, вот как это делается:
@echo off
setlocal enabledelayedexpansion enableextensions
set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof
:file_name_from_path <resultVar> <pathVar>
(
set "%~1=%~nx2"
exit /b
)
:eof
endlocal
Теперь функцию :file_name_from_path
можно использовать в любом месте, чтобы получить значение, а не только для переданных в аргументах. Это может быть очень полезно, если аргументы могут быть переданы в файл в неопределенном порядке или путь не передается вообще в файл.
Чтобы назначить их переменным, не забудьте добавить пробелы спереди или после знака равенства:
set filepath=%~dp1
set filename=%~nx1
Тогда у вас не должно быть проблем.
Если кто-то хочет альтернативный метод...
Если это последний подкаталог в пути, вы можете использовать этот однострочный ключ:
cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s
Это вернет следующее:
c:\directory\subdirectory
The.... возвращается к предыдущему каталогу. /ad показывает только каталоги /b - список голых форматов /s включает все подкаталоги. Это используется для получения полного пути к каталогу для печати.
Если принятый ответ Wadih не работает для вас, попробуйте echo %CD%
У меня была такая же проблема в моем цикле, где я хотел извлечь zip файлы в том же каталоге, а затем удалить zip файл. Проблема заключалась в том, что 7z требует выходную папку, поэтому мне пришлось получить путь к папке для каждого файла. Вот мое решение:
FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
7z.exe x %%i -aoa -o%%i\..
)
%% я был полным именем файла, а% ii \.. просто возвращает родительскую папку.
надеюсь, что это поможет.