Dapatkan nama folder saat ini dengan perintah DOS?

60

Apakah mungkin untuk mendapatkan nama folder saat ini (bukan jalur direktori saat ini) dengan menggunakan perintah DOS? Jika ya, bagaimana caranya?

Yang paling dekat yang saya dapatkan adalah ini tetapi tidak melakukannya:

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

catatan: upaya di atas adalah saya mencoba tokenize string dan mendapatkan set token terakhir sebagai variabel CURR.

Djangofan
sumber
Jika Anda memiliki segala jenis GNU toolset yang diinstal, Anda harus dapat pergi cd | sed "s/.*\\//"(Itu mem-pipe output dari cd (cwd) ke pencarian ekspresi reguler dan ganti, mengganti semuanya sebelum final \ dengan apa-apa sama sekali)
Phoshi
2
saya perlu menghindari alat GNU sehingga file batch akan bekerja di mana saja untuk siapa saja. Pertanyaan saya adalah untuk "DOS murni".
Djangofan
Baik. Google cepat menunjukkan hasil SO untuk menerapkan pencarian regex dan mengganti dalam VBScript ( stackoverflow.com/questions/127318/… ) yang dapat menggunakan sintaks yang sama dan membuat hasil yang sama - Saya percaya VBScript telah dibangun sejak windows 98, jadi harus cukup di mana saja untuk semua orang! (Anda juga dapat dengan mudah bergabung kembali untuk bekerja pada * nix OS ', juga)
Phoshi
3
FYI, tidak ada for /fTomWij %~n*yang didukung dalam MS-DOS. (Windows' cmd.exeadalah tidak DOS, itu program Windows asli.)
grawity

Jawaban:

85

Cara terpendek yang saya temukan:

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

atau dalam skrip .bat:

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

atau di .bat dengan Dapatkan nilai dalam variabel.

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

Penjelasan: http://www.robvanderwoude.com/ntfor.php

nx berarti hanya nama file dan ekstensi

Tamara Wijsman
sumber
Saya suka tautan dan sarannya tetapi ketika saya meletakkannya di file batch saya langsung mendapatkan penutupan shell tanpa output. pasti ada kesalahan sintaksis di sana?
Djangofan
3
Contoh ini akan bekerja pada baris perintah secara interaktif. Untuk menggunakannya dalam file batch Anda harus mengganti semua kemunculan %dengan %%.
Mike Fitzpatrick
2
Juga, contoh tidak menangani nama folder dengan benar yang berisi titik ( .), seperti folder% USERPROFILE% saya.
Mike Fitzpatrick
1
Ya, berfungsi jika Anda mengganti '%' dengan '%%'. Jawaban bagus. Akan menjadi jawaban yang diterima jika itu dicatat sebelumnya.
djangofan
1
Apa pun sihir jahat yang mengerikan ini, aku senang itu berhasil. Saya kenal dengan sebagian besar sintaksis ekspansi, tapi saya belum pernah melihatnya *menggunakannya sebelum oo
kayleeFrye_onDeck
30

Jika Anda ingin mengetahui lokasi file batch saat ini (dan jika Windows Anda bukan rilis yang sangat kuno), ketikkan for /?jendela 'kotak DOS'. Gulir ke bawah. Baca.

Anda akan menemukan, bahwa Anda sekarang dapat membaca (dari dalam file batch) variabel-variabel ini:

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

Ini bekerja untuk banyak kasus. Asumsikan, kumpulan berkas disebut mytest.bat. Anda dapat menyebutnya dengan berbagai cara:

  1. ..\..\to\mytest.bat ............................... (jalur relatif)
  2. d:\path\to\mytest.bat........................... (jalur penuh)
  3. \\fileserver\sharename\mytest.bat... (jalur berbagi jarak jauh)

... dan Anda akan selalu mendapatkan nilai yang tepat dalam variabel Anda.

Kurt Pfeifle
sumber
1
wow, cukup menarik kan. perintah "echo% ~ dp0" memecahkan masalah saya juga dan ini lebih elegan.
djangofan
5
Baiklah kalau begitu - peduli untuk memberi saya '+1'?
Kurt Pfeifle
Tidak, dengan alasan bahwa 'untuk /?' adalah tempat pertama yang jelas saya melihat dan jawaban ini tidak lebih baik dari apa yang diharapkan oleh siapa pun.
djangofan
4
@ Djangofan: Jadi Anda mengatakan 'Wow, cukup menarik Anda benar ...' untuk sesuatu yang sudah Anda ketahui ?! Untuk jawaban yang tidak berkontribusi pada pengetahuan Anda? (Anda tahu, '+1' mengklik ^ -arrow - berbeda dengan membuat jawaban yang diterima ....)
Kurt Pfeifle
1
tampaknya yang terakhir seharusnya %~dpnx0, bukan?
luc
15

Saya pribadi suka jawaban Toms, sampai ia berjuang dengan titik-titik dalam nama dir. Ini memberi saya petunjuk:

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

Jawaban Tom bagus, tetapi jika Anda memiliki nama direktori dengan tanda titik di dalamnya (mis. Wxwidgets-2.9.4) Anda hanya akan mendapatkan nama lengkap. Jadi ini akan menghasilkan wxwidgets-2.9 ​​sebagai gantinya karena .4 telah diperlakukan sebagai ekstensi (Ya, meskipun itu adalah nama direktori!).

Untuk mendapatkan nama hasil lengkap, Anda harus menambahkan ekstensi sampai akhir:

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

dan dalam mode file batch:

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

Atau tentu saja, tetapkan variabel dalam file batch sebagai gantinya:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI
Brian Sidebotham
sumber
4

Cara lain adalah:

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

ini bekerja dengan "." dan spasi di pathname

Apa fungsinya?

  1. letakkan seluruh nama file (driveletter-path-filename-extension) ke dalam MyPathVar

  2. hapus nama file dan ekstensi dari MyPathvar

Ini juga bekerja dengan UNC Paths. Jika Anda memerlukan Backslash di ujung Path. Hapus \setelah MyPathdalam perintah set kedua, mis.

set "MyPath=%%MyPath:%~nx0=%%"
lenz
sumber
1
Jadi bagaimana ini berbeda dari%~dp0
Amit Naidu
4

Anda bisa mendapatkan dir saat ini menjadi variabel. Satu-liner:

set a=%cd%

Periksa dengan

echo %a%
vera
sumber
6
Dia menginginkan nama direktori saat ini, bukan keseluruhan path, dan sebagai == cd, Anda juga dapat menggunakan% cd%.
Paradroid
2

sederhana saja

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

atau

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

Hati-hati dengan backslash di ujung jalan, itu tidak harus backslash di ujung.

kygg
sumber
1

Jawaban saya di utas ini melakukannya dalam 3 baris sederhana:

@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
Djangofan
sumber
1

Ini bekerja untuk saya dari file batch. Ini mengembalikan nama direktori kerja saat ini.

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