Отримати назву поточної папки за допомогою команди 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

Добре. Швидкий google показав результат SO для впровадження пошуку та заміни регулярних виразів у VBScript ( stackoverflow.com/questions/127318/… ), який міг би використовувати один і той же синтаксис і створювати той самий результат - я вважаю, VBScript вбудований з Windows 98, так має бути зовсім де завгодно для всіх! (Ви також можете дуже легко перемотати його для роботи над * nix OS ')
Phoshi

3
FYI, for /fні TomWij %~n*не підтримуються в MS-DOS. (Windows ' cmd.exeце НЕ DOS, це рідна програма для Windows.)
grawity

Відповіді:


84

Найкоротшим способом я знайшов:

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 означає лише ім'я файлу та розширення


Мені подобається посилання та пропозиція, але коли я поміщаю це у пакетний файл, я отримую негайне закриття оболонки без виводу. там десь повинна бути синтаксична помилка?
djangofan

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

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

1
Так, працює, якщо ви заміните "%" на "%%". Гарна відповідь. Була б прийнята відповідь, якби це було зазначено раніше.
djangofan

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" також вирішує мою проблему та її більш елегантну.
djangofan

5
Гаразд тоді - хочете присвоїти мені "+1" тоді?
Курт Пфайфл

Ні, з тієї причини, що "за /?" було очевидним першим місцем, на який я дивився, і тому ця відповідь не краща за те, що хтось очікує.
djangofan

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 Paths. Якщо вам потрібен зворотний проміжок в кінці Шляху. Видаліть команду \after MyPathу другому наборі, наприклад.

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

1
То чим це відрізняється від%~dp0
Аміт Найду

4

Ви можете отримати поточний dir в змінну. Одноколісний:

set a=%cd%

Перевірте

echo %a%

6
Він хоче, щоб поточне ім'я каталогів, а не весь шлях, і як == cd, ви також можете використовувати% cd%.
парадороїд

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.