49

Можно ли получить текущее имя папки (не текущий путь к каталогу) с помощью команды DOS? Если так, то как?

Самое близкое, что я получил, было это, но оно этого не делает:

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

примечание: вышеупомянутая попытка была моей попыткой токенизировать строку и получить последний токен, установленный как переменная CURR.

9 ответов9

71

Кратчайший путь, который я нашел:

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

или в сценарии .bat:

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

или в .bat со значением Get в переменной.

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

Объяснение: http://www.robvanderwoude.com/ntfor.php

nx означает только имя файла и расширение

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 ... (путь к удаленному ресурсу)

... и вы всегда получите правильное значение в ваших переменных.

15

Мне лично понравился ответ Томса, пока он не боролся с точками в именах режиссеров. Это дало мне подсказку:

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

Ответ Тома хороший, но если у вас есть имя каталога с точкой (например, wxwidgets-2.9.4), вы получите только полное имя. Таким образом, вместо этого будет выведен wxwidgets-2.9, потому что .4 рассматривается как расширение (Да, даже если это имя каталога!).

Чтобы получить полное имя выхода, вы должны добавить расширение до конца:

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) в MyPath Var

  2. удалить имя файла и расширение из MyPath var

Это также работает с путями UNC. Если вам нужен обратный слеш в конце пути. Удалите \ after MyPath во второй команде set, например.

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

Вы можете получить текущий каталог в переменную. Один лайнер:

set a=%cd%

Проверить с

echo %a%
1

Просто

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .