2013-03-22 30 views
42

Làm cách nào tôi có thể trích xuất đường dẫn và tên tệp từ một biến?Đường dẫn và tên tệp Trích xuất hàng loạt từ một biến

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

Tôi muốn làm điều đó mà không cần sử dụng bất kỳ chức năng nào hoặc bất kỳ GOTO nào. là nó có thể?

+2

có thể trùng lặp của [Làm thế nào để phân chia các tên tập tin từ một đường dẫn đầy đủ trong hàng loạt?] (http://stackoverflow.com/questions/9252980/how-to-split-the-filename-from-a-full-path-in-batch) – iTayb

Trả lời

94
@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 
) 

Không thực sự chắc chắn những gì bạn có nghĩa là không có "chức năng"

Rõ ràng, thay đổi ECHO-SET để thiết lập các biến khá thon vang vọng họ ...

Xem http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx cho đầy đủ danh sách.

+2

Điều này không hoạt động đối với đường dẫn tệp có khoảng trắng – meir

+1

@meir - true ; Tôi đã đăng chỉnh sửa. Bạn học được rất nhiều trong một vài năm. – Magoo

+0

@TrivisionZero: Không, dấu ngoặc kép được yêu cầu trong trường hợp tên tệp hoặc đường dẫn chứa dấu cách. – Magoo

85

Bạn chỉ có thể trích xuất đường dẫn và tên tệp từ (1) tham số của chính BAT %1 hoặc (2) tham số CALL %1 hoặc (3) biến cục bộ FOR %%a.


trong HELP CALL hoặc HELP FOR bạn có thể tìm kiếm thông tin chi tiết hơn:

% ~ 1 - mở rộng% 1 loại bỏ bất kỳ dấu ngoặc kép xung quanh (")
% ~ f1 - mở rộng% từ 1 tới một đầy đủ tên đường dẫn
% ~ d1 - mở rộng% từ 1 tới một ký tự ổ đĩa chỉ
% ~ p1 - mở rộng% từ 1 tới một con đường duy nhất
% ~ n1 - mở rộng% từ 1 tới một tên tập tin chỉ
% ~ x1 - mở rộng% từ 1 tới một phần mở rộng tập tin chỉ
% ~ s1 - con đường mở rộng chứa tên ngắn chỉ
% ~ a1 - mở rộng% từ 1 tới tập tin thuộc tính
% ~ t1 - mở rộng% từ 1 tới ngày/giờ của tập tin
% ~ z1 - mở rộng% từ 1 tới kích thước của tập tin


Và sau đó hãy thử như sau:

Hoặc vượt qua chuỗi để được phân tích như một tham số để một CALL

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

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

hoặc tương đương, vượt qua tên tập tin như một địa phương CHO biến

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

nếu bạn muốn infos từ batchfile chạy thực tế, thử điều này:

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

nhiều mẫu? C:> GIÚP GỌI

% 0 = tham số 0 = batchfile % 1 = tham số 1 - mệnh 1. được chuyển đến batchfile ... để bạn có thể thử nội dung đó (ví dụ: "~ dp") trong khoảng từ 1 (ví dụ: "%") và cuối cùng (ví dụ:"1") cũng cho các thông số

3

Tất cả điều này làm việc cho tôi:

@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 

Output:

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 
Các vấn đề liên quan