Hanya mengubah beberapa skrip shell menjadi file batch dan ada satu hal yang sepertinya tidak dapat saya temukan ... dan itu adalah hitungan sederhana dari jumlah argumen baris perintah.
misalnya. jika Anda memiliki:
myapp foo bar
Di Shell:
- $ # -> 2
- $ * -> bilah foo
- $ 0 -> aplikasi saya
- $ 1 -> foo
- $ 2 -> bar
Dalam batch
- ?? -> 2 <---- perintah apa ?!
- % * -> bilah foo
- % 0 -> aplikasi saya
- % 1 -> foo
- % 2 -> bar
Jadi saya telah melihat sekeliling, dan entah saya mencari di tempat yang salah atau saya buta, tetapi sepertinya saya tidak dapat menemukan cara untuk menghitung jumlah argumen baris perintah yang diteruskan.
Apakah ada perintah yang mirip dengan shell "$ #" untuk file batch?
ps. yang paling dekat yang saya temukan adalah mengulang melalui% 1s dan menggunakan 'shift', tetapi saya perlu merujuk% 1,% 2 dll nanti di skrip jadi itu tidak bagus.
shell
batch-file
scripting
pyko
sumber
sumber
2 myapp foo bar
?Jawaban:
Sedikit googling memberi Anda hasil berikut dari wikibook :
Sepertinya cmd.exe telah berevolusi sedikit dari masa DOS sebelumnya :)
sumber
for
hanya berfungsi untuk argumen yang terlihat seperti nama file, bukan string opsi seperti-?
. Menggunakan tanda kutip (for %%i in ("%*") ...
) berfungsi untuk argumen seperti-?
tetapi sekali lagi gagal untuk argumen yang dikutip karena kutipan bertingkat. Satu-satunya cara yang kuat tampaknya melibatkanshift
...MyBatchFile "*.*" "Abc"
melaporkan bahwa argC == 9. - Suara negatif.Anda cenderung menangani sejumlah argumen dengan logika semacam ini:
dll.
Jika Anda memiliki lebih dari 9 argumen maka Anda kacau dengan pendekatan ini. Ada berbagai peretasan untuk membuat penghitung yang dapat Anda temukan di sini , tetapi berhati-hatilah karena ini bukan untuk yang lemah hati.
sumber
shift
untuk menghitung lebih dari 9 ... dan tanpa 10 baris kode yang tampak sama.Fungsi di
:getargc
bawah ini mungkin yang Anda cari.Ini pada dasarnya mengulang sekali daftar (yang merupakan fungsi lokal sehingga pergeseran tidak akan mempengaruhi daftar kembali di program utama), menghitungnya sampai habis.
Ini juga menggunakan trik bagus, meneruskan nama variabel return yang akan disetel oleh fungsi.
Program utama hanya mengilustrasikan bagaimana memanggilnya dan menggemakan argumen setelahnya untuk memastikan bahwa mereka tidak tersentuh:
sumber
echo Count is %argc%
Anda akan memasukkan kode Anda sendiri yang dapat memeriksa apakah hitungan itu tepat dan kemudian melanjutkan.Coba ini:
sumber
Jika jumlah argumen harus berupa angka eksak (kurang atau sama dengan 9), maka ini adalah cara sederhana untuk memeriksanya:
sumber
Hindari penggunaan salah satu
shift
ataufor
siklus dengan mengorbankan ukuran dan keterbacaan.Keluaran:
EDIT: "Trik" yang digunakan di sini melibatkan:
Membangun string yang mewakili variabel argumen baris perintah yang sedang dievaluasi (yaitu "% 1", "% 2" dll.) Menggunakan string yang berisi karakter persen (
%%
) dan variabel penghitungarg_idx
pada setiap pengulangan perulangan.Menyimpan string itu ke dalam variabel
curr_arg_label
.Meneruskan string (
!curr_arg_label!
) dan nama variabel kembalian (curr_arg_value
) ke subprogram primitifget_value
.Dalam subprogram, nilai argumen pertama (
%1
) digunakan di sisi kiri assignment (set
) dan nilai argumen kedua (%2
) di sisi kanan. Namun, ketika argumen subprogram kedua dilewatkan, argumen tersebut diselesaikan menjadi nilai argumen baris perintah program utama oleh penerjemah perintah. Artinya, apa yang diteruskan bukanlah, misalnya, "% 4" tetapi berapa pun nilai yang dimiliki variabel argumen baris perintah keempat ("another_arg" dalam penggunaan sampel).Kemudian variabel yang diberikan ke subprogram sebagai variabel kembalian (
curr_arg_value
) diuji karena tidak ditentukan, yang akan terjadi jika argumen baris perintah yang saat ini dievaluasi tidak ada. Awalnya ini adalah perbandingan nilai variabel kembalian yang dibungkus dalam tanda kurung siku dengan tanda kurung siku kosong (yang merupakan satu-satunya cara saya mengetahui program pengujian atau argumen subprogram yang mungkin berisi tanda kutip dan merupakan sisa yang diabaikan dari fase trial-and-error) tetapi sejak ditetapkan ke bagaimana sekarang.sumber
Jawaban terakhir sekarang adalah dua tahun lalu, tetapi saya membutuhkan versi untuk lebih dari sembilan argumen baris perintah. Mungkin yang lain juga ...
Solusinya adalah 19 baris pertama dan mengubah semua argumen menjadi variabel dalam gaya c-like. Semua hal lain hanya menyelidiki hasilnya dan menunjukkan konversi ke argumen lokal. Anda dapat mereferensikan argumen dengan indeks dalam fungsi apa pun.
sumber
Solusi yang tepat adalah dengan mendelegasikan penghitungan ke subrutin yang dipanggil dengan
call
; subrutin menggunakangoto
pernyataan untuk meniru perulangan yangshift
digunakan untuk menggunakan argumen (hanya subrutin) secara berulang:sumber