Получить имя текущей папки командой DOS?


60

Можно ли получить текущее имя папки (не текущий путь к каталогу) с помощью команды 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" в любом случае.
Джангофан

Хорошо. Быстрый Google показал SO результат для реализации поиска и замены регулярных выражений в VBScript ( stackoverflow.com/questions/127318/… ), который мог бы использовать тот же синтаксис и создать тот же результат - я считаю, что VBScript был встроен начиная с Windows 98, поэтому должно быть где угодно для всех! (Вы также можете очень легко перенастроить его для работы на * nix OS ')
Phoshi

3
К вашему сведению, ни MS-DOS , ни for /fTomWij %~n*не поддерживаются. (Windows ' cmd.exeэто не DOS, это родная программа для Windows.)
grawity

Ответы:


85

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

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 означает только имя файла и расширение


Мне нравится ссылка и предложение, но когда я помещаю это в командный файл, я получаю немедленное закрытие оболочки без вывода. там где-то должна быть синтаксическая ошибка?
Джангофан

3
Пример будет работать в командной строке в интерактивном режиме. Для того, чтобы использовать его в пакетном файле необходимо заменить все вхождения %с %%.
Майк Фицпатрик

2
Кроме того, в примере неправильно обрабатываются имена папок, содержащих точку ( .), например, моя папка% USERPROFILE%.
Майк Фицпатрик

1
Да, работает, если вы замените «%» на «%%». Хороший ответ. Был бы принятым ответом, если бы это было отмечено ранее.
Джангофан

1
Каким бы ни было это чудовищное злое колдовство, я рад, что оно работает. Я знаком с большинством синтаксиса расширения, но я никогда не видел, чтобы он *использовался до этого oo
kayleeFrye_onDeck

30

Если вы хотите узнать текущее местоположение командного файла (и если ваша Windows не очень старая версия), введите for /?в окне «DOS box». Прокрутить вниз. Читать.

Вы узнаете, что теперь вы можете читать (из в пакетном файле) этих переменных:

%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" также решает мою проблему и делает ее более элегантной.
Джангофан

5
Хорошо, тогда - хочешь наградить меня «+1» тогда?
Курт Пфайфл

Нет, по той причине, что 'для /?' было очевидным первое место, которое я посмотрел, и поэтому этот ответ не лучше, чем кто-либо ожидал.
Джангофан

4
@djangofan: Значит, вы говорите «Вау, интересно, вы правы ...» на то, что вы уже знали ?! На ответ, который не повлиял на ваши знания? (Вы знаете, «+1» нажимает на стрелку ^ - это отличается от того, чтобы сделать ответ принятым ....)
Курт Пфайфл

1
кажется, что последний должен быть %~dpnx0, не так ли?
Люк

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) в MyPathVar

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

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

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

1
Так как это отличается от%~dp0
Амит Найду

4

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

set a=%cd%

Проверить с

echo %a%

6
Ему нужно имя текущего каталога, а не весь путь, и в качестве == 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.