Bisakah file batch Windows menentukan nama filenya sendiri?

121

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"?

djangofan.dll
sumber
1
%0adalah apa yang Anda cari. Lihat [pertanyaan ini] [1] untuk informasi lebih lanjut. [1]: stackoverflow.com/questions/357315/…
Jonathon Reinhart
2
Ya, itulah yang saya cari. % ~ nx0 adalah jawabannya.
djangofan

Jawaban:

160

Iya.

Gunakan %0variabel khusus untuk mendapatkan jalur ke file saat ini.

Tulis %~n0untuk mendapatkan nama file saja tanpa ekstensi.

Tulis %~n0%~x0untuk mendapatkan nama file dan ekstensi.

Juga memungkinkan untuk menulis %~nx0untuk mendapatkan nama file dan ekstensi.

SLaks
sumber
1
Ini tidak akurat. Baik% 0 dan% ~ n0 hanya mendapatkan bagian nama file. Jawaban @djangofan benar.
JustJeff
5
% 0 mengembalikan cara file dipanggil. Jika jalur lengkap digunakan,% 0 akan memilikinya. Jika Anda cdmasuk 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)
Gogowitsch
@ gogowitsch: Apakah Anda yakin? Saya tidak berpikir itu benar.
SLaks
Pada Win2012, %cd%akan mengembalikan Direktori Saat Ini dari proses yang disebut file batch. Jadi, jika Anda berada di prompt masuk D:\dir1dan masuk Y:\foo\bar.bat, jika bar.battelah @echo %cd%maka itu akan keluar D:\dir1.
Pengkhotbah
48

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, %~nx0memberi Anda "foo.bat", sementara %~dpnx0memberikan "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"

JustJeff
sumber
3
Di blok kode Anda, Anda menyatakan itu fadalah nama file, tetapi dalam contoh Anda, Anda gunakan nuntuk nama file. Setelah beberapa pengujian, tampaknya itu fadalah jalur lengkap, dan nmerupakan nama file.
Drew Chapin
@druciferre, saya edit jawabannya menurut komentar Anda
robotik
"Jika kamu menjadi manis dan mencoba %~xnpd0" ... Aku mencintaimu.
Mark Deven
32

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.

djangofan.dll
sumber
9

Ingatlah itu 0adalah kasus khusus nomor parameter di dalam file batch, di mana 0berarti 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 %0atau %~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. %~0menghapus kutipan dari contoh terakhir, sedangkan yang %0tidak.

Karena ini semua memberikan hasil yang berbeda, %0 dan %~0sangat 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
Jool
sumber
3

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
Cary
sumber
0

Di bawah ini adalah kode awal saya:

@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.

Bukti Saya:

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

Ini kode terakhirnya

@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
Fred Tusing
sumber