Как получить путь к папке из пути к файлу с CMD - PullRequest
136 голосов
/ 18 марта 2009

Мне нужен путь к папке, содержащей файл cmd. С% 0 я могу получить имя файла. Но как получить имя папки?

c: \ temp \ test.cmd >> test.cmd

P.S. Моя текущая директория! = Папка скрипта.

Ответы [ 6 ]

289 голосов
/ 18 марта 2009

Для имени папки и диска вы можете использовать:

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 (да, для DOS ...) показывает 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
45 голосов
/ 08 ноября 2012

Принятый ответ полезен, но не сразу понятно, как извлечь имя файла из пути, если вы НЕ используете переданные значения. Я смог решить это из этой темы, но если другим не повезло, вот как это делается:

@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 можно использовать где угодно для получения значения, а не только для аргументов, переданных в аргументах. Это может быть чрезвычайно полезно, если аргументы могут быть переданы в файл в неопределенном порядке или путь вообще не передан в файл.

7 голосов
/ 27 февраля 2011

Чтобы назначить их переменным, не добавляйте пробелы перед или после знака равенства:

set filepath=%~dp1
set filename=%~nx1

Тогда у вас не должно быть проблем.

2 голосов
/ 04 декабря 2017

Если принятый ответом Вадих не сработал, попробуйте echo %CD%

2 голосов
/ 22 сентября 2016

У меня была такая же проблема в цикле, когда я хотел извлечь zip-файлы из той же директории, а затем удалить zip-файл. Проблема заключалась в том, что 7z требует выходной папки, поэтому мне пришлось получить путь к папке каждого файла. Вот мое решение:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% i был полным путем к имени файла, а% ii \ .. просто возвращает родительскую папку.

надеюсь, это поможет.

2 голосов
/ 29 апреля 2014

На случай, если кто-нибудь захочет альтернативный метод ...

Если это последний подкаталог в пути, вы можете использовать этот однострочный:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

Это вернет следующее:

c:\directory\subdirectory

.... возвращается к предыдущему каталогу. / объявление показывает только каталоги / b - листинг в чистом формате / s включает в себя все подкаталоги. Используется для получения полного пути к каталогу для печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...