ไฟล์แบตช์ Windows สามารถกำหนดชื่อไฟล์ของตัวเองได้หรือไม่?


122

ไฟล์แบตช์ Windows สามารถกำหนดชื่อไฟล์ของตัวเองได้หรือไม่?

ตัวอย่างเช่นถ้าฉันรันไฟล์แบตช์ C: \ Temp \ myScript.bat มีคำสั่งภายใน myScript.bat ที่สามารถกำหนดสตริง "myScript.bat" ได้หรือไม่


1
%0คือสิ่งที่คุณกำลังมองหา ดู [คำถามนี้] [1] สำหรับข้อมูลเพิ่มเติม [1]: stackoverflow.com/questions/357315/…
Jonathon Reinhart

2
ใช่นั่นคือสิ่งที่ฉันกำลังมองหา % ~ nx0 คือคำตอบ
djangofan

คำตอบ:


161

ใช่.

ใช้%0ตัวแปรพิเศษเพื่อรับเส้นทางไปยังไฟล์ปัจจุบัน

เขียน%~n0เพื่อให้ได้ชื่อไฟล์ที่ไม่มีนามสกุล

เขียน%~n0%~x0เพื่อรับชื่อไฟล์และนามสกุล

ยังสามารถเขียน%~nx0เพื่อรับชื่อไฟล์และนามสกุล


1
นี่เป็นเพียงความไม่ถูกต้อง ทั้ง% 0 และ% ~ n0 รับแค่ส่วนชื่อไฟล์ คำตอบของ @djangofan ถูกต้อง
JustJeff

5
% 0 ส่งคืนวิธีการเรียกไฟล์ หากใช้เส้นทางแบบเต็ม% 0 จะมีสิ่งนั้น หากคุณcdเข้าสู่ dir ก่อนและดำเนินการแบตช์จากที่นั่นโดยปกติแล้ว% 0 จะไม่มีข้อมูลเส้นทาง (แต่คุณจะได้รับจาก% cd% ในกรณีนั้น)
Gogowitsch

@gogowitsch: แน่ใจเหรอ? ฉันไม่คิดว่าเป็นเรื่องจริง
SLaks

ใน Win2012 %cd%จะส่งคืนไดเรกทอรีปัจจุบันของกระบวนการที่เรียกว่าไฟล์แบตช์ ดังนั้นถ้าคุณมีความในพรอมต์D:\dir1และป้อนY:\foo\bar.batถ้าbar.batมีแล้วมันจะออก@echo %cd% D:\dir1
นักเทศน์

48

คุณสามารถรับชื่อไฟล์ได้ แต่คุณยังสามารถรับเส้นทางแบบเต็มได้โดยขึ้นอยู่กับสิ่งที่คุณวางไว้ระหว่าง "% ~" และ "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"


3
ในบล็อกโค้ดของคุณคุณระบุว่านั่นfคือชื่อไฟล์ แต่ในตัวอย่างของคุณคุณใช้nสำหรับชื่อไฟล์ หลังจากการทดสอบบางครั้งดูเหมือนว่าfจะเป็นเส้นทางแบบเต็มและnเป็นชื่อไฟล์
Drew Chapin

@druciferre ฉันแก้ไขคำตอบตามความคิดเห็นของคุณ
robotik

"ถ้าน่ารักก็พยายาม%~xnpd0" ... รักนะ
Mark Deven

33

ฉันใช้สคริปต์ต่อไปนี้ตามคำตอบ 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 '~' จะใช้เพื่อตัด / ตัดเครื่องหมายคำพูดออกจากตัวแปร


9

จำไว้ว่า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

3

ลองเรียกใช้ตัวอย่างด้านล่างเพื่อให้รู้สึกว่าตัวแปรวิเศษทำงานอย่างไร

@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

0

ด้านล่างนี้คือรหัสเริ่มต้นของฉัน:

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