Cách nhận đường dẫn thư mục từ đường dẫn tệp với CMD


151

Tôi cần đường dẫn đến thư mục chứa tập tin cmd. Với% 0 tôi có thể lấy tên tệp. Nhưng làm thế nào để có được tên thư mục?

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

PS Thư mục hiện tại của tôi! = Thư mục của tập lệnh.

Câu trả lời:


310

Đối với tên thư mục và ổ đĩa, bạn có thể sử dụng:

echo %~dp0

Bạn có thể nhận được nhiều thông tin hơn bằng cách sử dụng các sửa đổi khác nhau:

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

Đây là một bản sao dán từ "cho /?" lệnh trên dấu nhắc. Hy vọng nó giúp.

Liên quan

10 mẹo hàng đầu về DOS Batch (Có, DOS Batch ...) hiển thị batchparams.bat (liên kết đến nguồn dưới dạng ý chính):

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

Mát mẻ. Tôi có cần một số điểm cụ thể để sửa đổi bài viết wiki của người khác không?
Wadih M.

@Wadih M.: Nói chung liên kết hữu ích stackoverflow.com/questions/18557/ trên
jfs

@Wadih M.: Cụ thể là stackoverflow.com/questions/130654/ từ
jfs

@Wadih M.: Từ liên kết trên: "+750 để chỉnh sửa các bài đăng 'wiki có thể chỉnh sửa của cộng đồng"
jfs

Vì vậy, nếu bạn muốn tập lệnh cmd đặt thư mục làm việc vào vị trí của tập lệnh: cd /d "%~dp0"(từ stackoverflow.com/questions/4451668 )
Nigel Touch

52

Câu trả lời được chấp nhận là hữu ích, nhưng không rõ ràng ngay lập tức làm thế nào để lấy tên tệp từ một đường dẫn nếu bạn KHÔNG sử dụng thông qua các giá trị. Tôi đã có thể làm việc này từ chủ đề này, nhưng trong trường hợp những người khác không may mắn như vậy, đây là cách nó được thực hiện:

@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

Bây giờ :file_name_from_pathhàm có thể được sử dụng ở bất cứ đâu để lấy giá trị, không chỉ cho các đối số được truyền vào. Điều này có thể cực kỳ hữu ích nếu các đối số có thể được truyền vào tệp theo thứ tự không xác định hoặc đường dẫn không được chuyển vào tệp.


ồ, thật tuyệt với! Vì vậy, các tệp windows hỗ trợ chức năng bên trong cùng một tệp, thật hữu ích! Từ khi nào điều này có thể?
Lu-ca

2
Tôi thích rằng bạn có thể chuyển các biến theo cả tham chiếu (nguyên trạng) và theo giá trị (được bao quanh bởi "!" S). Ok, có lẽ bạn không có biến "cục bộ" và ngăn xếp cuộc gọi ... nhưng này: rốt cuộc đó là tập lệnh cmd, dù sao đó cũng là một bước tiến lớn;) Tôi đồng ý, phân vùng nội dung trong một tệp sẽ tiện hơn nhiều hơn là chia nó xung quanh một số tệp :)
Luke

1
Tôi nghĩ "goto: eof" nên là "goto eof" .. không có dấu hai chấm .. vì nó đã phá vỡ đối với tôi.
Một Khud hề

2
Xem thêm: ss64.com/nt/syntax-args.html - chỉ sử dụng %~dp1cho ổ đĩa và đường dẫn.
Andrew

2
@AKhudurine là chính xác: ss64.com/nt/goto.html Với dấu hai chấm, goto bỏ qua endlocal (và bất cứ điều gì khác mà bạn đặt sau đó, như tạm dừng). Ngoài ra, bạn cần thêm "s xung quanh !myPath!nếu đường dẫn của bạn có khoảng trắng trong đó (hoặc có dấu ngoặc kép là một phần của myPath)
Rick

8

Để gán các biến này cho các biến, hãy đảm bảo không thêm khoảng trắng ở phía trước hoặc sau dấu bằng:

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

Sau đó, bạn không có vấn đề.


5

Trong trường hợp bất cứ ai cũng muốn một phương pháp thay thế ...

Nếu đó là thư mục con cuối cùng trong đường dẫn, bạn có thể sử dụng lớp lót này:

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

Điều này sẽ trả về như sau:

c:\directory\subdirectory

Các .... thả trở lại thư mục trước. / ad chỉ hiển thị các thư mục / b là một danh sách định dạng trần / s bao gồm tất cả các thư mục con. Điều này được sử dụng để có được đường dẫn đầy đủ của thư mục để in.


Nó có thể hoạt động đối với thư mục hiện tại, không phải là thư mục chứa tệp script.
Mike Chaliy

4

Tôi gặp vấn đề tương tự trong vòng lặp của mình khi tôi muốn trích xuất các tệp zip trong cùng thư mục và sau đó xóa tệp zip. Vấn đề là 7z yêu cầu thư mục đầu ra, vì vậy tôi phải lấy đường dẫn thư mục của mỗi tệp. Đây là giải pháp của tôi:

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

%% i là đường dẫn tên tệp đầy đủ và% ii \ .. chỉ cần trả về thư mục mẹ.

hy vọng nó giúp.


Nhanh chóng và hèn hạ. Tôi thích điều đó! Không bao giờ nghĩ rằng bạn lạnh mở rộng đường dẫn tệp bằng "\ .." và kết thúc với thư mục mẹ.
Oliver R.

Điều này làm việc với tôi trên Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii

Đúng! Điều này xoay quanh vấn đề% ~ dp1 (v.v.) chỉ hoạt động trên% 0,% 1,% 2, v.v.
Artelius

3

Trong trường hợp câu trả lời được chấp nhận bởi Wadih không hiệu quả với bạn, hãy thử echo %CD%


0

Điều này đã được đặt cùng với một số ví dụ chỉnh sửa 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.