Bir DOS komutuyla mevcut klasör adını al?


58

DOS komutunu kullanarak geçerli klasör adını (geçerli dizin yolu değil) elde etmek mümkün mü? Öyleyse nasıl?

En yakınım bu oldu ama yapmıyor:

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

not: Yukarıdaki deneme, dizeyi tokenize etmeye ve CURR değişkeni olarak ayarlanan son belirteci almaya çalışmamdı.


Herhangi bir GNU araç setine sahipseniz, cd | sed "s/.*\\//"(CD'nin (cwd) çıktısını düzenli bir ifadeyle aramaya ve değiştirmeye çalışmalı, finalden önceki her şeyi değiştirerek değiştirmelisiniz)
Phoshi

2
Toplu iş dosyasının herkes için herhangi bir yerde çalışabilmesi için GNU araçlarından kaçınmam gerekiyor. Benim sorum zaten zaten "saf DOS".
djangofan

Peki. Hızlı bir google , aynı sözdizimini kullanan ve aynı sonucu oluşturan VBScript'te ( stackoverflow.com/questions/127318/… ) regex araması yapmak ve yerine geçmek için bir SO sonucu gösterdi - sanırım, Windows 98’den bu yana VBScript’in oluşturulduğuna inanıyorum. herkes için epey bir yerde olmalı! (Ayrıca, * nix OS 'üzerinde de çalışmasını çok kolay bir şekilde kabul edebilirsin)
Phoshi

3
Bilginize, ne for /fTomWijs %~n*MS-DOS'da desteklenmiyor. (Windows' cmd.exeolduğunu , DOS değil bir doğal Windows program.)
grawity

Yanıtlar:


83

Bulduğum en kısa yol:

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

veya bir .bat komut dosyasında:

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

veya değişkende değeri ile .bat içinde.

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

Açıklama: http://www.robvanderwoude.com/ntfor.php

nx yalnızca dosya adı ve uzantısı anlamına gelir


Bağlantıyı ve öneriyi beğendim ancak bir toplu iş dosyasına koyduğumda, kabuğuna çıktı vermeden derhal kapanıyor. orada bir yerde bir sözdizimi hatası olmalı?
djangofan

3
Örnek, komut satırında etkileşimli olarak çalışacaktır. Bir toplu dosyasında kullanmak için tüm tekrarlarını değiştirmek gerekir %ile %%.
Mike Fitzpatrick

2
Ayrıca, örnek, .% USERPROFILE% klasörü gibi bir period ( ) içeren klasör adlarını doğru şekilde işlemez .
Mike Fitzpatrick

1
Evet, '%' yerine '%%' değiştirirseniz çalışır. Güzel cevap Daha önce belirtilmiş olsaydı, kabul edilen cevap olurdu.
djangofan

1
Bu korkunç kötülük büyüsü her ne ise, işe yaramasına sevindim. Genişleme sözdiziminin çoğuna aşinayım, ancak daha önce hiç *kullanmamıştım oo
kayleeFrye_onDeck

30

Toplu iş dosyasının geçerli konumunu bilmek istiyorsanız (ve Windows'unuz çok eski bir sürüm değilse) for /?bir 'DOS kutusu' penceresine yazın. Aşağı kaydır. Okuyun.

Sen şimdi (dan okuyabileceği, dışarı bulacaksınız içinde bu değişkenler toplu dosya):

%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 ...]

Bu birçok durumda işe yarar. Toplu iş dosyasının çağrıldığını varsayalım mytest.bat. Bunu farklı şekillerde arayabilirsiniz:

  1. ..\..\to\mytest.bat ............................... (göreceli yol)
  2. d:\path\to\mytest.bat........................... (tam yol)
  3. \\fileserver\sharename\mytest.bat... (uzak paylaşımdaki yol)

... ve değişkenlerinizde her zaman doğru değeri elde edersiniz.


1
Vay canına, yeterince ilginç. "echo% ~ dp0" komutu benim sorunumu da çözüyor ve daha da zarif.
djangofan

5
Tamam o zaman - o zaman bana '+1' vermeyi düşünür müsün?
Kurt Pfeifle

Hayır, çünkü 'için mi?' Baktığım ilk yer barizdi ve bu yüzden bu cevap kimsenin beklediğinden daha iyi değil.
djangofan

4
@djangofan: Sen zaten bildiğin bir şey için 'Vay, ilginç bir şekilde haklısın ...' diyorsun ?! Bilgine katkısı olmayan bir cevaba mı? (Bilirsiniz, '+1' ^ -arrow'u tıklıyor - kabul edileni cevaplamaktan farklı. ....)
Kurt Pfeifle

1
Sonuncusu olması gerektiği gibi görünüyor %~dpnx0, değil mi?
luc

15

Ben kişisel olarak Tom’ların cevabını beğendim, dir. Bu bana bir ipucu verdi:

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

5

Tom'un cevabı iyidir, ancak içinde belirli bir süre olan bir dizin isminiz varsa (yani wxwidgets-2.9.4) sadece tam adını alırsınız. Bu yüzden, bunun yerine wxwidgets-2.9 ​​çıkacaktır, çünkü .4 bir uzantı olarak kabul edildi (Evet, bir dizin adı olsa bile!).

Çıktı isminin tamamını almak için sonuna uzantı eklemelisiniz:

FOR %I IN (.) DO Echo %~nI%~xI

ve toplu iş dosyası modunda:

FOR %%I IN (.) DO Echo %%~nI%%~xI

Veya elbette, toplu iş dosyasında bir değişken ayarlayın:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

Başka bir yol:

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

"." ile çalışır. pathname içindeki boşluklar

Bu ne işe yarıyor?

  1. içine bütün dosya (sürücüharfi-yolu dosya yerine uzatma) koymak MyPathVar

  2. MyPathvar adını dosya adını ve uzantısını kaldır

Aynı zamanda UNC Paths ile çalışır. Yolun sonundaki Backslash'a ihtiyacınız varsa. İkinci set komutunda \sonrasını kaldırın MyPath, örn.

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

1
Peki bu nasıl farklı%~dp0
Amit Naidu 16:13

4

Geçerli dizini bir değişkene alabilirsiniz. Tek astarı:

set a=%cd%

İle kontrol edin

echo %a%

5
Geçerli dizin adını değil, tüm yolu istiyor ve bir == cd olarak,% cd% 'i de kullanabilirsiniz.
paradroid

2

sadece basit

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

veya

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

Yolun sonunun ters eğik çizgisine dikkat edin, sonun ters eğik çizgisi olmamalıdır.


1

Bu konudaki cevabım 3 basit satırda yazıyor:

@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

Bu benim için bir toplu iş dosyasından çalışır. Geçerli çalışma dizini adını döndürür.

pushd %1 & for %%i in (.) do @echo %%~ni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.