Як отримати шлях до папки з шляху файлів за допомогою CMD


151

Мені потрібен шлях до папки, що містить файл cmd. З% 0 я можу отримати ім'я файлу. Але як отримати ім’я папки?

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

PS Мій поточний каталог! = Папка сценарію.

Відповіді:


310

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

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

Класно. Чи потрібен мені певний бал, щоб змінити чужі публікації у вікі?
Wadih M.

@Wadih М.: Взагалі корисне посилання stackoverflow.com/questions/18557 / ...
JFS

@Wadih М.: Зокрема , stackoverflow.com/questions/130654 / ...
JFS

@Wadih M .: З вищенаведеного посилання: "+750 для редагування публікацій спільноти" для редагування вікі "
jfs

Тож якщо ви хочете, щоб cmd-скрипт встановив робочу директорію на місце розташування сценарію: cd /d "%~dp0"(від stackoverflow.com/questions/4451668 )
Nigel Touch

52

Прийнята відповідь корисна, але не відразу зрозуміло, як отримати ім’я файлу з контуру, якщо ви НЕ використовуєте передані значення. Я зміг опрацювати це з цієї теми, але якщо іншим не пощастило, ось як це робиться:

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


вау, це дивовижно! Отже, підтримка пакетних файлів Windows функціонує всередині одного файлу, як корисно! З коли це було можливо?
Лука

2
Мені подобається, що ви можете передавати змінні як за посиланням (як є), так і за значенням (в оточенні "!" S). Гаразд, ви, мабуть, не маєте "локальних" змінних та стека викликів ... але ей: це все-таки cmd-скрипт, це все одно великий крок; ніж розділяти його на кілька файлів :)
Лука

1
Я думаю, що "goto: eof" повинно бути "goto eof" .. без товстої кишки .. як це було для мене ламанням.
А Худайри

2
Дивіться також: ss64.com/nt/syntax-args.html - використовувати лише %~dp1для диска та шляху.
Андрій

2
@AKhudairy правильна: ss64.com/nt/goto.html З двокрапкою гото пропускає ендокал (і все, що ви ставите після цього, як пауза). Також вам потрібно додати "s навколо, !myPath!якщо на вашому шляху є пробіли (або котирування будуть частиною myPath)
Rick

8

Щоб призначити їх змінним, не забудьте додавати пробіли спереду або після знака рівності:

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

Тоді у вас не повинно виникнути жодних проблем.


5

У випадку, якщо хтось хоче альтернативного методу ...

Якщо це останній підкаталог на шляху, ви можете використовувати цей однокласник:

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

Це поверне наступне:

c:\directory\subdirectory

.... повертається до попереднього каталогу. / ad показує лише каталоги / b - список голого формату / s включає всі підкаталоги. Це використовується для отримання повного шляху до каталогу для друку.


Це, ймовірно, працює проти поточного каталогу, а не в каталозі, де знаходиться файл сценарію.
Майк Чалій

4

У мене в тій же петлі була проблема, де я хотів витягнути поштові файли в той же каталог, а потім видалити zip-файл. Проблема полягала в тому, що 7z вимагає вихідної папки, тому мені довелося отримати шлях до папки кожного файлу. Ось моє рішення:

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

%% i був повним шляхом до імені файлу, і% ii \ .. просто повертає батьківську папку.

сподіваюся, що це допомагає.


Швидкий і брудний. Мені це подобається! Ніколи не думав, що ти холодно розшириш шлях до файлу з "\ .." і закінчиш батьківською папкою.
Олівер Р.

Це працювало для мене на Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii

Так! Це вирішує проблему, що% ~ dp1 (тощо) працює лише на% 0,% 1,% 2 тощо
Artelius


0

Це було складено разом з відредагованим прикладом cmd

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

:end
PAUSE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.