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

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

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

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

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

11 ответов

Решение

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

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

Если вы хотите узнать текущее местоположение командного файла (и если ваша 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... (путь на удаленном ресурсе)

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

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

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

Ответ Тома хорош, но если у вас есть имя каталога с точкой (например, 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

You can get the current dir into a variable. Один лайнер:

set a=%cd%

Проверить с

echo %a%

Другой способ это:

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

это работает с "." и пробелы в пути

Что оно делает?

  1. положить все имя файла (driveletter-path-filename-extension) в MyPath Var

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

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

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

Просто

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

или же

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

Будьте осторожны с обратной косой чертой конца пути, она не должна быть обратной косой черты конца.

Мой ответ в этой теме состоит из 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

Это работает для меня из командного файла. Возвращает имя текущего рабочего каталога.

pushd %1 & for %%i in (.) do @echo %%~ni

      set "_cd=%cd:\=" & set "_cd=%"

Возможно расширение вкоманда, использующая переменную, хранящую текущую папку/путь %cd%и получите имя текущей папки, одновременно сохраняя это значение в переменной без использования for | for /fцикл и/или дополнительная командная строка:


      echo %cd%
C:\Users\ecker\AppData\Local\Temp

:: set _cd with auto expansion from value of %cd% ::
:: set _cd=C:\Users\ecker\AppData\Local\Temp      ::

set "_cd=%cd:\=" & set "_cd=%"
echo %_cd%
Temp

  • Чтобы визуализировать, как работает авторасширение, используйте:
      echo %cd:\=" & set "_cd=%
C:" & set "_cd=Windows" & set "_cd=System32


  • Вдохновлен ссылками:

Практически все приведенные выше варианты кода приведут к ошибке, если вы вызовете bat-файл извне другим скриптом или программой. Например, этот код: для %%I в (.) Установите CurrDirName=%%~nxI, при вызове из Notepad++ будет выводить Notepad++, но мне точно не нужно имя родительской папки Notepad++! Это плохой способ. Кроме того, по той же причине не используйте%cd% и любые другие параметры. Используйте только входные параметры этого, возможно, удаленного скрипта. В противном случае вы получите результат для вызывающего, но не вызываемого сценария и то, что написано в его командной строке, но не то, что должно быть написано в командной строке вызываемого кода. Используйте этот код, чтобы избежать ошибок:

    set path=%~p0
    set path=%path:~0,-1%
    For %%A in ("%path%") do (Set CurrDirName=%%~nxA)
Другие вопросы по тегам