รับชื่อโฟลเดอร์ปัจจุบันโดยคำสั่ง 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 เพื่อให้ไฟล์ชุดทำงานได้ทุกที่ทุกคน คำถามของฉันสำหรับ "pure DOS" ต่อไป
djangofan

Alright google ฉบับย่อแสดงผลลัพธ์ SO สำหรับการใช้การค้นหาและแทนที่ regex ใน VBScript ( stackoverflow.com/questions/127318/ … ) ซึ่งสามารถใช้ไวยากรณ์เดียวกันและสร้างผลลัพธ์เดียวกัน - ฉันเชื่อว่า VBScript นั้นสร้างขึ้นตั้งแต่ windows 98 ดังนั้น ควรจะค่อนข้างทุกที่สำหรับทุกคน! (คุณยังสามารถได้อย่างง่ายดายมาก rejigger ไปทำงานบน OS * ระวัง' เกินไป)
Phoshi

3
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 พร้อมรับค่าในตัวแปร

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

คำอธิบาย: http://www.robvanderwoude.com/ntfor.php

nx หมายถึงชื่อไฟล์และส่วนขยายเท่านั้น


ฉันชอบลิงค์และคำแนะนำ แต่เมื่อฉันใส่มันลงในไฟล์แบทช์ฉันจะได้รับการปิดเชลล์ทันทีโดยไม่มีเอาต์พุต จะต้องมีข้อผิดพลาดทางไวยากรณ์ในที่นั่นที่ไหน?
djangofan

3
ตัวอย่างจะทำงานบนบรรทัดคำสั่งแบบโต้ตอบ หากต้องการใช้ในไฟล์แบตช์คุณต้องแทนที่%ด้วย%%ทั้งหมด
Mike Fitzpatrick

2
นอกจากนี้ตัวอย่างไม่ถูกต้องจัดการชื่อโฟลเดอร์ที่ประกอบด้วยจุด ( .) เช่นโฟลเดอร์% USERPROFILE% ของฉัน
Mike Fitzpatrick

1
ใช่ใช้งานได้หากคุณแทนที่ '%' ด้วย '%%' คำตอบที่ดี คงจะเป็นคำตอบที่ได้รับการยอมรับหากมีการระบุไว้ก่อนหน้านี้
djangofan

1
ไม่ว่าคาถาชั่วร้ายอันเลวร้ายนี้จะเป็นเช่นไรข้าก็ดีใจที่ได้ผล ฉันคุ้นเคยกับส่วนใหญ่ของไวยากรณ์การขยายตัว แต่ฉันไม่เคยเห็น*มันใช้มาก่อน oo
kayleeFrye_onDeck

30

หากคุณต้องการทราบตำแหน่งปัจจุบันของไฟล์แบทช์ (และหาก 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 ...]

วิธีนี้ใช้ได้หลายกรณี สมมติ batchfile mytest.batที่เรียกว่า คุณสามารถเรียกมันได้หลายวิธี:

  1. ..\..\to\mytest.bat ............................... (เส้นทางสัมพัทธ์)
  2. d:\path\to\mytest.bat........................... (เส้นทางแบบเต็ม)
  3. \\fileserver\sharename\mytest.bat... (เส้นทางที่แชร์จากระยะไกล)

... และคุณจะได้รับคุณค่าที่ถูกต้องในตัวแปรของคุณ


1
ว้าวน่าสนใจพอสมควรแล้ว คำสั่ง "echo% ~ dp0" แก้ปัญหาของฉันได้เช่นกันและดูสง่างามยิ่งขึ้น
djangofan

5
ถ้าอย่างนั้นตกลง - สนใจที่จะให้รางวัลฉันเป็น '+1' ไหม
Kurt Pfeifle

ไม่ด้วยเหตุผล 'สำหรับ /' เป็นที่แรกที่ฉันได้ดูอย่างชัดเจนดังนั้นคำตอบนี้ไม่ได้ดีไปกว่าสิ่งที่ทุกคนคาดหวัง
djangofan

4
@dangangofan: ดังนั้นคุณพูดว่า'ว้าวน่าสนใจพอที่คุณพูดถูก ... 'กับสิ่งที่คุณรู้มาแล้ว?! คำตอบที่ไม่ได้มีส่วนช่วยให้ความรู้ของคุณ? (คุณรู้ว่า '+1' กำลังคลิกที่ ^ -arrow - ต่างจากการตอบคำถามที่ได้รับการยอมรับ .... )
Kurt Pfeifle

1
ดูเหมือนว่าคนสุดท้ายควรจะ%~dpnx0เป็นใช่มั้ย
luc

15

โดยส่วนตัวแล้วผมชอบคำตอบของทอมส์จนกระทั่งมันต่อสู้กับจุดในชื่อ dir สิ่งนี้ให้คำแนะนำแก่ฉัน:

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

5

คำตอบของ Tom นั้นดี แต่ถ้าคุณมีชื่อไดเรกทอรีที่มีจุดอยู่ในนั้น (เช่น 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 หากคุณต้องการ Backslash ที่ส่วนท้ายของ Path ลบคำสั่ง\after MyPathในคำสั่ง set ที่สองเช่น

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

1
ดังนั้นสิ่งนี้แตกต่างจากอย่างไร%~dp0
Amit Naidu

4

คุณสามารถรับ dir ปัจจุบันเป็นตัวแปร หนึ่งในสายการบิน:

set a=%cd%

ตรวจสอบกับ

echo %a%

6
เขาต้องการชื่อไดเรกทอรีปัจจุบันไม่ใช่เส้นทางทั้งหมดและเป็น == cd คุณอาจใช้% cd% เช่นกัน
Paradroid

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.