Получить имя текущей папки командой 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
, Вы можете назвать это по-разному:
..\..\to\mytest.bat
............................... (относительный путь)d:\path\to\mytest.bat
........................... (полный путь)\\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%
это работает с "." и пробелы в пути
Что оно делает?
положить все имя файла (driveletter-path-filename-extension) в
MyPath
Varудалить имя файла и расширение из
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)