Как получить путь к папке из пути к файлу с помощью CMD
Мне нужен путь к папке, содержащей файл cmd. С %0 я могу получить имя файла. Но как получить имя папки?
c:temptest.УМК > тест>.cmd
P. S. мой текущий каталог != папка скрипта.
6 ответов:
для имени папки и диска можно использовать:
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
это копия вставить из "Для /?- команда в командной строке. Надеюсь, это поможет.
по теме
топ-10 DOS пакетный советы (Да, пакетные Дос...) показывает batchparams.летучая мышь (ссылка на источник как GiST):
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 .... возврат к предыдущему каталогу. /реклама показывает только каталоги /b-это голый формат листинга /S включает все подкаталоги. Это используется для получения полного пути к каталогу для печати.
У меня была такая же проблема в моем цикле, где я хотел извлечь zip-файлы в тот же каталог, а затем удалить zip-файл. Проблема заключалась в том, что 7z требует выходную папку, поэтому мне пришлось получить путь к папке каждого файла. Вот мое решение:
FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO ( 7z.exe x %%i -aoa -o%%i\.. )
%%i был полный путь к имени файла и %ii\.. просто возвращает родительскую папку.
надеюсь, что это помогает.