Пакетне вилучення шляху та імені файлу зі змінної


79

Як я можу витягти шлях та ім'я файлу зі змінної?

Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg

Я хочу зробити це, не використовуючи жодної функції або будь-якого GOTO. Це можливо?


Відповіді:


140
@ECHO OFF
SETLOCAL
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)

Не зовсім впевнений, що ви маєте на увазі під жодною "функцією"

Очевидно, змініть ECHOна, SETщоб встановити змінні, а не ECHOing їх ...

Повний список дивіться у for документації .


Тест Чезка (для довідки)

@ECHO OFF
SETLOCAL
set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
FOR /F "delims=" %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)

Коментар: будь ласка, дивіться коментарі.


1
@meir - правда; Я опублікував виправлення. Ви дізнаєтесь багато нового за пару років.
Magoo

@TrivisionZero: Ні, лапки потрібні в тому випадку, якщо ім'я файлу або шлях містить пробіли.
Magoo

@ceztko: Будь ласка, поясніть, що саме робить включення /f.
Magoo,

/ F Обмежує виконання циклу лише одним маркером, відповідно до документації . У моїх тестах це було необхідно, мабуть, тому що пройдений шлях був укладений лапками. У вашому прикладі це абсолютно безпечно, і це просто більш чітко про те, що цикл буде виконуватися лише один раз.
ceztko

На жаль, я скасовую зміни, оскільки помітив, що за допомогою / F він більше не працює у випадку пробілів у шляху. Тим не менше, у мене є проблеми з вашим кодом у моєму варіанті використання (розширення оболонки). Я більше не редагуватиму і пропонуватиму вам виправлення у моєму випадку, якщо я зможу його знайти.
ceztko

137

Ви можете витягти шлях та ім'я файлу лише з (1) параметра самого BAT %1або (2) з параметра CALL %1або (3) з локальної змінної FOR %%a.


в HELP CALLабоHELP FOR ви можете знайти більш детальну інформацію:

% ~ 1 - розгортає% 1, видаляючи будь-які навколишні лапки (")
% ~ f1 - розширює% 1 до повноцінного імені шляху
% ~ d1 - розширює% 1 лише до букви диска
% ~ p1 - розширює% 1 лише до контуру
% ~ n1 - розширює% 1 лише до імені файлу
% ~ x1 - розширює% 1 до розширення файлу
% ~ s1 - розширений шлях містить лише короткі імена
% ~ a1 - розширює% 1 до атрибутів файлу
% ~ t1 - розширює% 1 до дати / часу файлу
% ~ z1 - розширює% 1 до розміру файлу


А потім спробуйте наступне:

Або передайте рядок, який потрібно проаналізувати як параметр, у CALL

call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof

:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof

або еквівалент, передайте ім'я файлу як локальну змінну FOR

for %%a in (..\Desktop\fs.cfg) do (
    set file=%%~fa
    set filepath=%%~dpa
    set filename=%%~nxa
)    
echo %file% = %filepath% + %filename%

Шлях більш детальна відповідь. Дякую.
Хорхе Фуентес Гонсалес

13

Все це працює для мене:

@Echo Off
Echo Directory = %~dp0
Echo Object Name With Quotations=%0
Echo Object Name Without Quotes=%~0
Echo Bat File Drive = %~d0
Echo Full File Name = %~n0%~x0
Echo File Name Without Extension = %~n0
Echo File Extension = %~x0
Pause>Nul

Вихід:

Directory = D:\Users\Thejordster135\Desktop\Code\BAT\

Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"

Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat

Bat File Drive = D:

Full File Name = Path.bat

File Name Without Extension = Path

File Extension = .bat

2

якщо ви хочете отримати інформацію з фактичного запущеного файлу, спробуйте:

@echo off
set myNameFull=%0
echo myNameFull     %myNameFull%
set myNameShort=%~n0
echo myNameShort    %myNameShort%
set myNameLong=%~nx0
echo myNameLong     %myNameLong%
set myPath=%~dp0
echo myPath         %myPath%
set myLogfileWpath=%myPath%%myNameShort%.log
echo myLogfileWpath %myLogfileWpath%

більше зразків? C:> ДОПОМОГА

% 0 = параметр 0 = пакетний файл% 1 = параметр 1 - 1-й пар. передається в пакетний файл ... так що ви можете спробувати цей матеріал (наприклад, "~ dp") між 1-м (наприклад, "%") і останнім (наприклад, "1") також для параметрів


0

Пізня відповідь, я знаю, але для мене наступний сценарій досить корисний - і він також відповідає на питання, вдаривши двох мух одним прапором ;-)

Наступний сценарій розширює SendTo у контекстному меню провідника файлів:

@echo off
cls
if "%~dp1"=="" goto Install

REM change drive, then cd to path given and run shell there
%~d1
cd "%~dp1"
cmd /k
goto End

:Install
rem No arguments: Copies itself into SendTo folder
copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"

:End

Якщо запустити цей сценарій без будь-яких параметрів, двічі клацнувши на ньому, він скопіюється в папку SendTo та перейменує його на "A - Відкрити в CMD shell.cmd". Згодом він доступний у контекстному меню "SentTo".

Потім клацніть правою кнопкою миші будь-який файл або папку в провіднику Windows і виберіть "SendTo> A - Open in CMD shell.cmd"

Сценарій змінить диск і шлях до шляху, що містить вибраний файл або папку, і відкриє командну оболонку з цим шляхом - корисно для коду Visual Studio, оскільки тоді ви можете просто ввести "код". щоб запустити його в контексті вашого проекту.

Як це працює?

%0 - повний шлях пакетного сценарію
%~d1 - диск, що міститься в першому аргументі (наприклад, "C:")
%~dp1 - шлях, що міститься в першому аргументі
cmd /k - відкриває командну оболонку, яка залишається відкритою

Тут не використовується, але %~n1 це ім'я файлу першого аргументу.

Сподіваюся, це комусь корисно.

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