วิธีรับพา ธ โฟลเดอร์จากพา ธ ไฟล์ด้วย CMD


151

ฉันต้องการพา ธ ไปยังโฟลเดอร์ที่มีไฟล์ cmd ด้วย% 0 ฉันจะได้รับชื่อไฟล์ แต่จะได้ชื่อโฟลเดอร์ได้อย่างไร

c: \ temp \ test.cmd >> test.cmd

PS ไดเรกทอรีปัจจุบันของฉัน! = โฟลเดอร์ของสคริปต์

คำตอบ:


310

สำหรับชื่อโฟลเดอร์และไดรฟ์คุณสามารถใช้:

echo %~dp0

คุณสามารถรับข้อมูลได้มากขึ้นโดยใช้ตัวดัดแปลงต่าง ๆ :

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file

The modifiers can be combined to get compound results:
%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

นี่คือสำเนาการคัดลอกจาก "สำหรับ /?" คำสั่งในพรอมต์ หวังว่ามันจะช่วย

ที่เกี่ยวข้อง

เคล็ดลับ 10 อันดับของ DOS Batch (ใช่, DOS Batch ... )แสดงbatchparams.bat (ลิงก์ไปยังแหล่งข้อมูลเป็นส่วนสำคัญ):

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

เย็น. ฉันต้องการคะแนนเฉพาะเพื่อแก้ไขโพสต์ wiki ของคนอื่นหรือไม่
Wadih M.

@Wadih M .: ลิงค์ที่มีประโยชน์โดยทั่วไปstackoverflow.com/questions/18557/…
jfs

@Wadih M .: โดยเฉพาะstackoverflow.com/questions/130654/…
jfs

@Wadih M .: จากลิงก์ด้านบน: "+750 เพื่อแก้ไขโพสต์ 'wiki ที่แก้ไขได้' โดยชุมชน"
jfs

ดังนั้นหากคุณต้องการให้สคริปต์ cmd ตั้งค่าไดเรกทอรีทำงานเป็นที่ตั้งของสคริปต์: cd /d "%~dp0"(จากstackoverflow.com/questions/4451668 )
Nigel Touch

52

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

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

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


ว้าวมันน่าทึ่งมาก! ดังนั้น windows batch files สนับสนุนฟังก์ชั่นภายในไฟล์เดียวกันมีประโยชน์มากเพียงใด! ตั้งแต่นี้เป็นไปได้?
ลุค

2
ฉันชอบที่คุณสามารถส่งผ่านตัวแปรทั้งโดยอ้างอิง (ตาม) และตามตัวอักษร (ล้อมรอบด้วย "!" s) ตกลงคุณอาจไม่มีตัวแปร "local" และ call stack ... แต่เดี๋ยวก่อน: มันเป็นสคริปต์ cmd เพราะมันเป็นขั้นตอนใหญ่ข้างหน้าอย่างไรก็ตาม; กว่าแยกไปรอบ ๆ ไฟล์หลาย :)
ลูกา

1
ฉันคิดว่า "goto: eof" ควรเป็น "goto eof" .. โดยไม่ต้องโคลอน .. เพราะมันทำให้ฉันแตก
Khudairy

2
ดูเพิ่มเติมที่: ss64.com/nt/syntax-args.html - ใช้%~dp1สำหรับไดรฟ์และเส้นทางเท่านั้น
แอนดรู

2
@ AKhudairy ถูกต้อง: ss64.com/nt/goto.htmlด้วยเครื่องหมายจุดคู่ข้ามไปที่ข้าม endlocal (และสิ่งอื่นที่คุณใส่ในภายหลังเช่นหยุดชั่วคราว) นอกจากนี้คุณต้องเพิ่ม"รอบ!myPath!หากเส้นทางของคุณมีช่องว่างในนั้น (หรือมีคำพูดเป็นส่วนหนึ่งของ myPath)
Rick

8

ในการกำหนดสิ่งเหล่านี้ให้กับตัวแปรอย่าลืมเพิ่มช่องว่างด้านหน้าหรือหลังเครื่องหมายเท่ากับ:

set filepath=%~dp1
set filename=%~nx1

จากนั้นคุณควรไม่มีปัญหา


5

ในกรณีที่ทุกคนต้องการวิธีการอื่น ...

หากเป็นไดเรกทอรีย่อยสุดท้ายในพา ธ คุณสามารถใช้ซับคู่นี้ได้:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

สิ่งนี้จะคืนค่าต่อไปนี้:

c:\directory\subdirectory

.... ลดลงกลับไปยังไดเรกทอรีก่อนหน้า / ad แสดงเฉพาะไดเร็กตอรี่ / b เท่านั้นคือรายการรูปแบบ / s ประกอบด้วยไดเรกทอรีย่อยทั้งหมด ใช้เพื่อรับเส้นทางแบบเต็มของไดเรกทอรีที่จะพิมพ์


อาจทำงานกับไดเรกทอรีปัจจุบันไม่ใช่ไดเรกทอรีที่มีไฟล์สคริปต์อยู่
Mike Chaliy

4

ฉันมีปัญหาเดียวกันในลูปของฉันที่ฉันต้องการแตกไฟล์ zip ในไดเรกทอรีเดียวกันแล้วลบไฟล์ zip ปัญหาคือว่า 7z ต้องใช้โฟลเดอร์ผลลัพธ์ดังนั้นฉันต้องได้รับเส้นทางโฟลเดอร์ของแต่ละไฟล์ นี่คือทางออกของฉัน:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% ฉันเป็นพา ธ ของชื่อไฟล์แบบเต็มและ% ii \ .. จะส่งคืนโฟลเดอร์หลัก

หวังว่ามันจะช่วย


รวดเร็วและสกปรก ฉันชอบมัน! ไม่เคยคิดเลยว่าคุณจะขยายเส้นทางของไฟล์ด้วย "\ .. " และจบลงด้วยโฟลเดอร์หลัก
Oliver R.

สิ่งนี้ใช้ได้กับฉันใน Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii

ใช่ ปัญหานี้ได้รับการแก้ไขที่% ~ dp1 (ฯลฯ ) ใช้งานได้กับ% 0,% 1,% 2 ฯลฯ เท่านั้น
Artelius


0

นี่คือตัวอย่างบางส่วนที่มีการแก้ไข cmd

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

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