ไฟล์แบตช์ Windows สามารถกำหนดชื่อไฟล์ของตัวเองได้หรือไม่?
ตัวอย่างเช่นถ้าฉันรันไฟล์แบตช์ C: \ Temp \ myScript.bat มีคำสั่งภายใน myScript.bat ที่สามารถกำหนดสตริง "myScript.bat" ได้หรือไม่
ไฟล์แบตช์ Windows สามารถกำหนดชื่อไฟล์ของตัวเองได้หรือไม่?
ตัวอย่างเช่นถ้าฉันรันไฟล์แบตช์ C: \ Temp \ myScript.bat มีคำสั่งภายใน myScript.bat ที่สามารถกำหนดสตริง "myScript.bat" ได้หรือไม่
คำตอบ:
ใช่.
ใช้%0
ตัวแปรพิเศษเพื่อรับเส้นทางไปยังไฟล์ปัจจุบัน
เขียน%~n0
เพื่อให้ได้ชื่อไฟล์ที่ไม่มีนามสกุล
เขียน%~n0%~x0
เพื่อรับชื่อไฟล์และนามสกุล
ยังสามารถเขียน%~nx0
เพื่อรับชื่อไฟล์และนามสกุล
cd
เข้าสู่ dir ก่อนและดำเนินการแบตช์จากที่นั่นโดยปกติแล้ว% 0 จะไม่มีข้อมูลเส้นทาง (แต่คุณจะได้รับจาก% cd% ในกรณีนั้น)
%cd%
จะส่งคืนไดเรกทอรีปัจจุบันของกระบวนการที่เรียกว่าไฟล์แบตช์ ดังนั้นถ้าคุณมีความในพรอมต์D:\dir1
และป้อนY:\foo\bar.bat
ถ้าbar.bat
มีแล้วมันจะออก@echo %cd%
D:\dir1
คุณสามารถรับชื่อไฟล์ได้ แต่คุณยังสามารถรับเส้นทางแบบเต็มได้โดยขึ้นอยู่กับสิ่งที่คุณวางไว้ระหว่าง "% ~" และ "0" เลือกจาก
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
เช่นจากภายใน c: \ tmp \ foo.bat %~nx0
ให้คุณ "foo.bat" ในขณะที่%~dpnx0
ให้ "c: \ tmp \ foo.bat" โปรดทราบว่าชิ้นส่วนต่างๆจะประกอบตามลำดับ Canonical เสมอดังนั้นหากคุณน่ารักและพยายาม%~xnpd0
คุณจะยังคงได้รับ "c: \ tmp \ foo.bat"
f
คือชื่อไฟล์ แต่ในตัวอย่างของคุณคุณใช้n
สำหรับชื่อไฟล์ หลังจากการทดสอบบางครั้งดูเหมือนว่าf
จะเป็นเส้นทางแบบเต็มและn
เป็นชื่อไฟล์
%~xnpd0
" ... รักนะ
ฉันใช้สคริปต์ต่อไปนี้ตามคำตอบ SLaks ฉันพิจารณาแล้วว่าคำตอบที่ถูกต้องคือ:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
และนี่คือสคริปต์ทดสอบของฉัน:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
สิ่งที่ฉันคิดว่าน่าสนใจคือ% nx0 ใช้ไม่ได้เนื่องจากเรารู้ว่าโดยทั่วไปแล้ว char '~' จะใช้เพื่อตัด / ตัดเครื่องหมายคำพูดออกจากตัวแปร
จำไว้ว่า0
เป็นกรณีพิเศษของตัวเลขพารามิเตอร์ภายในไฟล์ชุดที่0
หมายความว่าไฟล์นี้ตามที่กำหนดในบรรทัดคำสั่ง
ดังนั้นหากไฟล์เป็น myfile.bat คุณสามารถเรียกมันได้หลายวิธีดังต่อไปนี้ซึ่งแต่ละไฟล์จะให้ผลลัพธ์ที่แตกต่างจาก%0
หรือ%~0
การใช้งาน:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
ทั้งหมดข้างต้นเป็นการเรียกตามกฎหมายหากคุณเรียกจากตำแหน่งสัมพัทธ์ที่ถูกต้องไปยังไดเร็กทอรีที่มีอยู่ %~0
ตัดเครื่องหมายคำพูดจากตัวอย่างสุดท้ายในขณะที่%0
ไม่
เนื่องจากสิ่งเหล่านี้ให้ผลลัพธ์ที่แตกต่างกัน%0
และ%~0
ไม่น่าจะเป็นสิ่งที่คุณต้องการใช้จริงๆ
นี่คือไฟล์แบตช์ที่จะแสดง:
@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause
ลองเรียกใช้ตัวอย่างด้านล่างเพื่อให้รู้สึกว่าตัวแปรวิเศษทำงานอย่างไร
@echo off
SETLOCAL EnableDelayedExpansion
echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with extension: %~nx0
echo Extension: %~x0
echo date time : %~t0
echo file size: %~z0
ENDLOCAL
กฎที่เกี่ยวข้องกำลังติดตาม
%~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
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string
@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
ฉันสังเกตเห็นว่าชื่อไฟล์ที่กำหนดโดย% ~ 0 และ% 0 เป็นวิธีที่ป้อนใน command-shell และไม่ใช่วิธีการตั้งชื่อไฟล์นั้นจริงๆ ดังนั้นหากคุณต้องการให้ตัวพิมพ์เล็กใช้สำหรับชื่อไฟล์คุณควรใช้% ~ n0 อย่างไรก็ตามสิ่งนี้จะทำให้นามสกุลไฟล์หลุดออกไป แต่ถ้าคุณทราบชื่อไฟล์คุณสามารถเพิ่มรหัสต่อไปนี้
set b=%~0
echo %~n0%b:~8,4%
ฉันได้เรียนรู้ว่า ": ~ 8,4%" หมายถึงเริ่มต้นที่อักขระตัวที่ 9 ของตัวแปรจากนั้นจึงแสดง 4 อักขระถัดไป ช่วงคือ 0 ถึงจุดสิ้นสุดของสตริงตัวแปร ดังนั้น% Path% จะยาวมาก!
fIlEnAmE.bat
012345678901
อย่างไรก็ตามนี่ไม่ใช่วิธีที่ดีเท่าวิธีแก้ปัญหาของ Jool (% ~ x0) ด้านบน
C:\bin>filename.bat
%0.......filename.bat
%~0......filename.bat
. . .
C:\bin>fIlEnAmE.bat
%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\
%~n0%b:~8,4%...FileName.bat
Press any key to continue . . .
C:\bin>dir
Volume in drive C has no label.
Volume Serial Number is CE18-5BD0
Directory of C:\bin
. . .
05/02/2018 11:22 PM 208 FileName.bat
@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
%0
คือสิ่งที่คุณกำลังมองหา ดู [คำถามนี้] [1] สำหรับข้อมูลเพิ่มเติม [1]: stackoverflow.com/questions/357315/…