Lấy tên thư mục hiện tại bằng lệnh DOS?


59

Có thể lấy tên thư mục hiện tại (không phải đường dẫn thư mục hiện tại) bằng cách sử dụng lệnh DOS? Nếu vậy thì thế nào?

Cái gần nhất tôi có là cái này nhưng nó không làm được:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

lưu ý: nỗ lực trên là tôi đã cố gắng mã hóa chuỗi và nhận mã thông báo cuối cùng được đặt làm biến CURR.


Nếu bạn đã cài đặt bất kỳ bộ công cụ GNU nào, bạn sẽ có thể chuyển cd | sed "s/.*\\//"(Điều đó đưa đầu ra của cd (cwd) vào một tìm kiếm biểu thức thông thường và thay thế, thay thế mọi thứ trước khi cuối cùng \ không có gì cả)
Phoshi

2
tôi cần tránh các công cụ GNU để tệp bó sẽ hoạt động ở mọi nơi cho mọi người. Câu hỏi của tôi là cho dù sao "DOS thuần túy".
djangofan

Ổn thỏa. Một google nhanh chóng cho thấy kết quả SO để thực hiện tìm kiếm regex và thay thế trong VBScript ( stackoverflow.com/questions/127318/ mẹo ) có thể sử dụng cùng một cú pháp và tạo ra kết quả tương tự - Tôi tin rằng VBScript đã được xây dựng từ windows 98, vì vậy nên là bất cứ nơi nào cho tất cả mọi người! (Bạn cũng có thể dễ dàng khởi động lại nó để hoạt động trên * nix OS ')
Phoshi

3
FYI, cả for /fTomWij %~n*đều không được hỗ trợ trong MS-DOS. (Windows ' không phảicmd.exeDOS, đây là chương trình Windows gốc.)
grawity

Câu trả lời:


84

Cách ngắn nhất tôi đã tìm thấy:

for %I in (.) do echo %~nxI

hoặc trong tập lệnh .bat:

for %%I in (.) do echo %%~nxI

hoặc trong .bat với giá trị trong biến.

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

Giải thích: http://www.robvanderwoude.com/ntfor.php

nx có nghĩa là tên tệp và phần mở rộng


Tôi thích liên kết và gợi ý nhưng khi tôi đặt nó trong một tệp bó, tôi sẽ đóng ngay lập tức trình bao không có đầu ra. phải có một lỗi cú pháp ở đâu đó?
djangofan

3
Ví dụ sẽ hoạt động trên dòng lệnh tương tác. Để sử dụng nó trong một tệp bó, bạn cần thay thế tất cả các lần xuất hiện %bằng %%.
Mike Fitzpatrick

2
Ngoài ra, ví dụ này không xử lý chính xác tên thư mục có chứa dấu chấm ( .), chẳng hạn như thư mục% USERPROFILE% của tôi.
Mike Fitzpatrick

1
Có, hoạt động nếu bạn thay thế '%' bằng '%%'. Câu trả lời tốt đẹp. Sẽ là câu trả lời được chấp nhận nếu điều đó được ghi nhận trước đó.
djangofan

1
Dù phép thuật xấu xa khủng khiếp này là gì, tôi rất vui vì nó hoạt động. Tôi quen thuộc với hầu hết các cú pháp mở rộng, nhưng tôi chưa bao giờ thấy *nó được sử dụng trước đó oo
kayleeFrye_onDeck

30

Nếu bạn muốn biết vị trí hiện tại của tệp bó (và nếu Windows của bạn không phải là bản phát hành rất cổ), hãy nhập for /?vào cửa sổ 'Hộp DOS'. Cuộn xuống. Đọc.

Bạn sẽ tìm ra rằng bây giờ bạn có thể đọc (từ trong tệp bó) các biến này:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

Điều này làm việc cho nhiều trường hợp. Giả sử, batchfile được gọi mytest.bat. Bạn có thể gọi nó theo nhiều cách khác nhau:

  1. ..\..\to\mytest.bat ............................... (đường dẫn tương đối)
  2. d:\path\to\mytest.bat........................... (đường dẫn đầy đủ)
  3. \\fileserver\sharename\mytest.bat... (đường dẫn trên chia sẻ từ xa)

... Và bạn sẽ luôn nhận được giá trị phù hợp trong các biến của mình.


1
wow, đủ thú vị quyền của bạn. lệnh "echo% ~ dp0" cũng giải quyết vấn đề của tôi và thanh lịch hơn.
djangofan

5
Được rồi - quan tâm để trao cho tôi một '+1' sau đó?
Kurt Pfeifle

Không, vì lý do 'cho /?' là nơi đầu tiên rõ ràng tôi nhìn và vì vậy câu trả lời này không tốt hơn những gì mọi người mong đợi.
djangofan

4
@djangofan: Vì vậy, bạn nói 'Wow, thật thú vị, bạn đúng ...' với những gì bạn đã biết?! Để một câu trả lời không đóng góp cho kiến ​​thức của bạn? (Bạn biết đấy, '+1' đang nhấp vào ^ -arrow - khác với việc đưa ra câu trả lời được chấp nhận ....)
Kurt Pfeifle

1
Có vẻ như cái cuối cùng phải %~dpnx0không?
luc

15

Cá nhân tôi thích câu trả lời của Tom, cho đến khi nó vật lộn với các dấu chấm trong tên dir. Điều này đã cho tôi một gợi ý:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa

5

Câu trả lời của Tom là tốt, nhưng nếu bạn có một tên thư mục có dấu chấm trong đó (ví dụ: wxwidgets-2.9.4), bạn sẽ chỉ nhận được tên đầy đủ. Vì vậy, điều này sẽ tạo ra wxwidgets-2.9 ​​thay vì vì .4 đã được coi là một phần mở rộng (Có, mặc dù đó là tên thư mục!).

Để có được tên đầu ra đầy đủ, bạn phải thêm vào phần mở rộng đến cuối:

FOR %I IN (.) DO Echo %~nI%~xI

và trong chế độ tập tin hàng loạt:

FOR %%I IN (.) DO Echo %%~nI%%~xI

Hoặc tất nhiên, thay vào đó, hãy đặt một biến trong tệp bó:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

Một cách khác là:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

nó hoạt động với "." và khoảng trắng trong tên đường dẫn

Nó làm gì?

  1. đặt toàn bộ tên tệp (driveletter-path-filename-extension) vào MyPathVar

  2. xóa tên tệp và phần mở rộng khỏi MyPathvar

Nó cũng hoạt động với UNC Paths. Nếu bạn cần Backslash ở cuối Đường dẫn. Loại bỏ \sau MyPathtrong lệnh thiết lập thứ hai, ví dụ.

set "MyPath=%%MyPath:%~nx0=%%"

1
Vậy nó khác với thế nào%~dp0
Amit N Nikol

4

Bạn có thể lấy thư mục hiện tại thành một biến. Lót:

set a=%cd%

Kiểm tra với

echo %a%

6
Anh ta muốn tên thư mục hiện tại, không phải toàn bộ đường dẫn và là a == cd, bạn cũng có thể sử dụng% cd%.
paradroid

2

đơn giản thôi mà

for %%d in ("%CD%") do echo %%~nxd

hoặc là

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

Hãy cẩn thận với dấu gạch chéo cuối của đường dẫn, nó không phải là dấu gạch chéo ngược của kết thúc.


1

Câu trả lời của tôi trong chủ đề này thực hiện trong 3 dòng đơn giản:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

Điều này làm việc cho tôi từ một tập tin hàng loạt. Nó trả về tên thư mục làm việc hiện tại.

pushd %1 & for %%i in (.) do @echo %%~ni
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.