DOS 명령으로 현재 폴더 이름을 가져 오시겠습니까?


58

DOS 명령을 사용하여 현재 폴더 이름 (현재 디렉토리 경로가 아님)을 가져올 수 있습니까? 그렇다면 어떻게?

내가 얻은 가장 가까운 것은 이것이지만 그렇게하지 않습니다.

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

참고 : 위의 시도는 문자열을 토큰 화하고 마지막 토큰 세트를 CURR 변수로 가져 오려고했습니다.


당신은 GNU 도구 세트의 어떤 종류가 설치되어있는 경우, 당신은 갈 수 있어야한다 cd | sed "s/.*\\//"(전혀 아무것도 \ 최종 전에 모든 것을 대체, 파이프 및 정규 표현식 검색에 CD (CWD)의 출력이 교체하는 것이)
Phoshi

2
배치 파일이 어느 곳에서나 작동하도록 GNU 도구를 피해야합니다. 내 질문은 어쨌든 "순수한 DOS"입니다.
djangofan

좋구나. 빠른 구글은 VBScript ( regoverflow.com/questions/127318/… ) 에서 정규 표현식 검색 및 바꾸기를 구현 하여 동일한 구문을 사용하고 동일한 결과를 생성 할 수 있는 SO 결과를 보여주었습니다 .VBScript는 Windows 98 이후 내장되어 있다고 생각합니다. 모두를 위해 아주 어디에나 있어야합니다! (* nix OS에서도 작동하도록 매우 쉽게 조정할 수 있습니다)
Phoshi

3
참고 로 MS-DOS에서는 for /fTomWij도 TomWij %~n*도 지원 하지 않습니다 . (Windows cmd.exeDOS아니며 기본 Windows 프로그램입니다.)
grawity

답변:


84

내가 찾은 가장 짧은 방법 :

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

또는 .bat 스크립트 내에서 :

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

또는 변수의 값 가져 오기를 사용하여 .bat에 있습니다.

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

설명 : http://www.robvanderwoude.com/ntfor.php

nx는 파일 이름과 확장자 만 의미합니다


나는 링크와 제안을 좋아하지만 배치 파일에 넣을 때 출력없이 쉘을 즉시 닫습니다. 어딘가에 구문 오류가 있어야합니까?
djangofan

3
이 예제는 명령 행에서 대화식으로 작동합니다. 배치 파일에서 사용하려면 모든 항목을 %로 바꾸어야 %%합니다.
마이크 피츠 패트

2
또한이 예제에서는 .내 % USERPROFILE % 폴더와 같이 마침표 ( )가 포함 된 폴더 이름을 올바르게 처리하지 못합니다 .
Mike Fitzpatrick

1
예, '%'를 '%%'로 바꾸면 작동합니다. 좋은 대답입니다. 이전에 언급 된 경우 허용 된 답변이었을 것입니다.
djangofan

1
이 신적인 악한 마법이 무엇이든간에, 나는 그것이 기쁘다. 나는 대부분의 확장 구문에 익숙하지만, *oo 이전에 사용 된 적이 없다
kayleeFrye_onDeck

30

배치 파일의 현재 위치를 알고 싶다면 (Windows가 매우 오래된 버전이 아닌 경우) for /?'DOS 상자'창에 입력하십시오. 아래로 스크롤. 읽다.

이제 배치 파일 에서 다음 변수를 읽을 수 있음을 알 수 있습니다 .

%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 ...]

이것은 많은 경우에 효과적입니다. 배치 파일이이라고 가정하십시오 mytest.bat. 다른 방법으로 호출 할 수 있습니다.

  1. ..\..\to\mytest.bat ............................... (상대 경로)
  2. d:\path\to\mytest.bat........................... (전체 경로)
  3. \\fileserver\sharename\mytest.bat... (원격 공유 경로)

... 그리고 당신은 항상 변수에서 올바른 가치를 얻습니다.


1
와우, 흥미롭게도 당신의 권리. "echo % ~ dp0"명령은 내 문제와 그보다 더 우아한 문제를 해결합니다.
djangofan

5
그렇다면 '+1'을 수여해야합니까?
커트 파이 플

아니요, 'for /?'라는 이유로 내가 본 첫 번째 장소 였으므로이 답변은 누구에게나 기대되는 것보다 낫지 않습니다.
djangofan 2016 년

4
@ djangofan : 그래서 당신은 '와우, 흥미롭게도 당신이 옳다 ...'라고 이미 알고있는 것에? 당신의 지식에 기여하지 않은 대답에? ( '+1'은 ^-화살표를 클릭하고 있다는 것입니다. 대답을 받아들이는 것과 다릅니다 ....)
Kurt Pfeifle

1
마지막 %~dpnx0이 아닌 것 같습니다 .
luc

15

나는 개인적으로 Toms의 대답이 마음에 들었습니다. 이것은 나에게 힌트를 주었다 :

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

5

Tom의 대답은 좋지만 마침표가있는 디렉토리 이름 (예 : wxwidgets-2.9.4)이 있으면 전체 이름 만 얻을 수 있습니다. 따라서 .4가 확장명으로 취급 되었기 때문에 대신 wxwidgets-2.9를 출력합니다 (예 : 디렉토리 이름 임에도 불구하고).

전체 출력 이름을 얻으려면 확장명을 끝에 추가해야합니다.

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

배치 파일 모드에서 :

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

또는 배치 파일에서 변수를 대신 설정하십시오.

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

4

다른 방법은 다음과 같습니다.

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

"."와 함께 작동합니다. 경로명의 공백

무엇을합니까?

  1. 전체 파일 이름 (driveletter-path-filename-extension)을 MyPathVar에 넣으십시오.

  2. MyPathvar 에서 파일 이름 및 확장자 제거

UNC 경로와도 작동합니다. 경로 끝에 백 슬래시가 필요한 경우. 예를 들어 두 번째 set 명령에서 \after MyPath를 제거하십시오 .

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

1
그래서에서이 다른 방법%~dp0
아 미트 Naidu는

4

현재 디렉토리를 변수로 가져올 수 있습니다. 짧막 한 농담:

set a=%cd%

확인

echo %a%

6
전체 경로가 아닌 현재 디렉토리 이름을 원하며 a == cd로 % cd %를 사용할 수도 있습니다.
paradroid

2

그냥 간단

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

또는

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

경로 끝의 백 슬래시를주의하십시오. 끝의 백 슬래시 일 필요는 없습니다.


1

이 스레드 에서 내 대답은 간단한 3 줄로 수행합니다.

@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

이것은 배치 파일에서 나를 위해 작동합니다. 현재 작업 디렉토리 이름을 리턴합니다.

pushd %1 & for %%i in (.) do @echo %%~ni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.