Bisakah file batch Windows menentukan nama filenya sendiri?
Misalnya, jika saya menjalankan file batch C: \ Temp \ myScript.bat, apakah ada perintah dalam myScript.bat yang dapat menentukan string "myScript.bat"?
Bisakah file batch Windows menentukan nama filenya sendiri?
Misalnya, jika saya menjalankan file batch C: \ Temp \ myScript.bat, apakah ada perintah dalam myScript.bat yang dapat menentukan string "myScript.bat"?
Jawaban:
Iya.
Gunakan %0
variabel khusus untuk mendapatkan jalur ke file saat ini.
Tulis %~n0
untuk mendapatkan nama file saja tanpa ekstensi.
Tulis %~n0%~x0
untuk mendapatkan nama file dan ekstensi.
Juga memungkinkan untuk menulis %~nx0
untuk mendapatkan nama file dan ekstensi.
cd
masuk ke dir terlebih dahulu dan menjalankan batch dari sana,% 0 biasanya tidak akan memiliki info jalur (tetapi Anda bisa mendapatkannya dari% cd% dalam hal ini)
%cd%
akan mengembalikan Direktori Saat Ini dari proses yang disebut file batch. Jadi, jika Anda berada di prompt masuk D:\dir1
dan masuk Y:\foo\bar.bat
, jika bar.bat
telah @echo %cd%
maka itu akan keluar D:\dir1
.
Anda bisa mendapatkan nama file, tapi Anda juga bisa mendapatkan path lengkapnya, tergantung apa yang Anda tempatkan di antara '% ~' dan '0'. Silakan pilih
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Misalnya, dari dalam c: \ tmp \ foo.bat, %~nx0
memberi Anda "foo.bat", sementara %~dpnx0
memberikan "c: \ tmp \ foo.bat". Perhatikan bahwa potongan selalu dirakit dalam urutan kanonik, jadi jika Anda menjadi lucu dan mencoba %~xnpd0
, Anda masih mendapatkan "c: \ tmp \ foo.bat"
f
adalah nama file, tetapi dalam contoh Anda, Anda gunakan n
untuk nama file. Setelah beberapa pengujian, tampaknya itu f
adalah jalur lengkap, dan n
merupakan nama file.
%~xnpd0
" ... Aku mencintaimu.
Dengan menggunakan script berikut, berdasarkan jawaban SLaks, saya menentukan bahwa jawaban yang benar adalah:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
Dan inilah skrip pengujian saya:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Yang saya anggap menarik adalah bahwa % nx0 tidak akan berfungsi, karena kita tahu bahwa karakter '~' biasanya digunakan untuk menghapus / memotong tanda kutip dari variabel.
Ingatlah itu 0
adalah kasus khusus nomor parameter di dalam file batch, di mana 0
berarti file ini diberikan pada baris perintah .
Jadi jika file tersebut adalah myfile.bat, Anda dapat memanggilnya dengan beberapa cara sebagai berikut, yang masing-masing akan memberi Anda keluaran yang berbeda dari penggunaan %0
atau %~0
:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Semua hal di atas adalah panggilan legal jika Anda memanggilnya dari tempat relatif yang benar ke direktori tempatnya berada. %~0
menghapus kutipan dari contoh terakhir, sedangkan yang %0
tidak.
Karena ini semua memberikan hasil yang berbeda, %0
dan %~0
sangat tidak mungkin menjadi apa yang sebenarnya ingin Anda gunakan.
Berikut adalah file batch untuk diilustrasikan:
@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
Coba jalankan contoh di bawah ini untuk merasakan bagaimana variabel magis bekerja.
@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
Aturan terkait mengikuti.
%~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.
Saya perhatikan bahwa nama file yang diberikan oleh% ~ 0 dan% 0 adalah cara memasukkannya ke dalam command-shell dan bukan bagaimana nama file itu sebenarnya. Jadi jika Anda ingin kasus literal digunakan untuk nama file Anda harus menggunakan% ~ n0. Namun, ini akan menghilangkan ekstensi file. Tetapi jika Anda mengetahui nama file Anda dapat menambahkan kode berikut.
set b=%~0
echo %~n0%b:~8,4%
Saya telah belajar bahwa ": ~ 8,4%" berarti mulai dari karakter ke-9 dari variabel dan kemudian tampilkan tunjukkan 4 karakter berikutnya. Rentangnya adalah 0 sampai akhir string variabel. Jadi% Path% akan sangat panjang!
fIlEnAmE.bat
012345678901
Namun, ini tidak terdengar seperti solusi Jool (% ~ x0) di atas.
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
adalah apa yang Anda cari. Lihat [pertanyaan ini] [1] untuk informasi lebih lanjut. [1]: stackoverflow.com/questions/357315/…