ฉันต้องการพา ธ ไปยังโฟลเดอร์ที่มีไฟล์ cmd ด้วย% 0 ฉันจะได้รับชื่อไฟล์ แต่จะได้ชื่อโฟลเดอร์ได้อย่างไร
c: \ temp \ test.cmd >> test.cmd
PS ไดเรกทอรีปัจจุบันของฉัน! = โฟลเดอร์ของสคริปต์
ฉันต้องการพา ธ ไปยังโฟลเดอร์ที่มีไฟล์ cmd ด้วย% 0 ฉันจะได้รับชื่อไฟล์ แต่จะได้ชื่อโฟลเดอร์ได้อย่างไร
c: \ temp \ test.cmd >> test.cmd
PS ไดเรกทอรีปัจจุบันของฉัน! = โฟลเดอร์ของสคริปต์
คำตอบ:
สำหรับชื่อโฟลเดอร์และไดรฟ์คุณสามารถใช้:
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
cd /d "%~dp0"
(จากstackoverflow.com/questions/4451668 )
คำตอบที่ได้รับการยอมรับมีประโยชน์ แต่ไม่ชัดเจนว่าจะดึงชื่อไฟล์จากเส้นทางได้อย่างไรถ้าคุณไม่ได้ใช้ค่าที่ส่งผ่าน ฉันสามารถทำงานนี้จากหัวข้อนี้ แต่ในกรณีที่คนอื่นไม่โชคดีนี่คือวิธี:
@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
ฟังก์ชั่นสามารถใช้งานได้ทุกที่เพื่อรับค่าไม่ใช่แค่ส่งผ่านในอาร์กิวเมนต์ สิ่งนี้จะมีประโยชน์อย่างยิ่งหากข้อโต้แย้งสามารถส่งผ่านไปยังไฟล์ตามลำดับที่กำหนดหรือเส้นทางไม่ได้ถูกส่งผ่านไปยังไฟล์เลย
%~dp1
สำหรับไดรฟ์และเส้นทางเท่านั้น
"
รอบ!myPath!
หากเส้นทางของคุณมีช่องว่างในนั้น (หรือมีคำพูดเป็นส่วนหนึ่งของ myPath)
ในการกำหนดสิ่งเหล่านี้ให้กับตัวแปรอย่าลืมเพิ่มช่องว่างด้านหน้าหรือหลังเครื่องหมายเท่ากับ:
set filepath=%~dp1
set filename=%~nx1
จากนั้นคุณควรไม่มีปัญหา
ในกรณีที่ทุกคนต้องการวิธีการอื่น ...
หากเป็นไดเรกทอรีย่อยสุดท้ายในพา ธ คุณสามารถใช้ซับคู่นี้ได้:
cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s
สิ่งนี้จะคืนค่าต่อไปนี้:
c:\directory\subdirectory
.... ลดลงกลับไปยังไดเรกทอรีก่อนหน้า / ad แสดงเฉพาะไดเร็กตอรี่ / b เท่านั้นคือรายการรูปแบบ / s ประกอบด้วยไดเรกทอรีย่อยทั้งหมด ใช้เพื่อรับเส้นทางแบบเต็มของไดเรกทอรีที่จะพิมพ์
ฉันมีปัญหาเดียวกันในลูปของฉันที่ฉันต้องการแตกไฟล์ zip ในไดเรกทอรีเดียวกันแล้วลบไฟล์ zip ปัญหาคือว่า 7z ต้องใช้โฟลเดอร์ผลลัพธ์ดังนั้นฉันต้องได้รับเส้นทางโฟลเดอร์ของแต่ละไฟล์ นี่คือทางออกของฉัน:
FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
7z.exe x %%i -aoa -o%%i\..
)
%% ฉันเป็นพา ธ ของชื่อไฟล์แบบเต็มและ% ii \ .. จะส่งคืนโฟลเดอร์หลัก
หวังว่ามันจะช่วย
ในกรณีที่คำตอบที่ยอมรับโดย Wadih ไม่ได้ผลสำหรับคุณลอง echo %CD%
นี่คือตัวอย่างบางส่วนที่มีการแก้ไข 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