Saya perlu memberikan ID dan kata sandi ke file batch pada saat menjalankan daripada melakukan hardcoding pada file tersebut.
Seperti inilah baris perintah:
test.cmd admin P@55w0rd > test-log.txt
batch-file
arguments
Keng
sumber
sumber
Jawaban:
Tip lain yang bermanfaat adalah menggunakan
%*
berarti "semua". Sebagai contoh:Ketika Anda menjalankan:
file batch di atas akan berjalan:
Saya mungkin memiliki sintaks yang sedikit salah, tetapi ini adalah ide umum.
sumber
shift
"muncul" argumen dari daftar. Asumsi oleh OP adalah bahwa%*
hanya akan menghasilkan argumen yang tersisa, tetapi tidak berfungsi seperti itu, seperti kata @ Joey.fake-command /u admin /p password admin password foo bar
. Ini ditunjukkan oleh @ Joey bertahun-tahun yang lalu.Begini cara saya melakukannya:
Begini tampilannya:
Yang
%1
berlaku untuk parameter pertama yang%2
(dan inilah bagian yang sulit) berlaku untuk yang kedua. Anda dapat memiliki hingga 9 parameter yang dilewati dengan cara ini.sumber
echo %1 %2
dan terlempar oleh kasing sederhana yang tidak dapat dilekatkan dengan@
danfake-command
dengan params, berpikir kami akan mendapatkanfake-command.bat
konten nanti (dalam hal ini, terlalu rumitfake-command.bat
mungkin harusecho %2 %4
mengabaikan nama-nama param). Salah, doofus. TL; DR: Jangan sebodoh saya. 1.echo echo %1 %2 > test.bat
2test word1 word2
.. 3. Keuntungan.Jika Anda ingin secara cerdas menangani parameter yang hilang, Anda dapat melakukan sesuatu seperti:
sumber
Mengakses parameter kumpulan bisa sederhana dengan% 1,% 2, ...% 9 atau juga% *,
tetapi hanya jika kontennya sederhana.
Tidak ada cara sederhana untuk konten yang kompleks seperti
"&"^&
, karena tidak mungkin mengakses% 1 tanpa menghasilkan kesalahan.Garis melebar ke
Dan setiap baris gagal, karena salah satu di
&
luar tanda kutip.Ini dapat diatasi dengan membaca dari file sementara versi parameter yang dikomentari .
Caranya adalah dengan mengaktifkan
echo on
dan memperluas% 1 setelahrem
pernyataan (berfungsi juga dengan%2 .. %*
).Jadi, bahkan
"&"&
dapat digaungkan tanpa menghasilkan kesalahan, seperti yang dikatakan.Tetapi untuk dapat mengarahkan kembali output
echo on
, Anda memerlukan dua for-loop.Karakter tambahan
* #
digunakan untuk aman terhadap konten seperti/?
(akan menunjukkan bantuan untukREM
).Atau tanda sisipan ^ pada baris akhir bisa berfungsi sebagai karakter multiline, bahkan setelah a
rem
.Kemudian membaca output parameter rem dari file, tetapi hati-hati.
FOR / F harus bekerja dengan ekspansi yang tertunda, selain konten dengan "!" akan dihancurkan.
Setelah menghapus karakter tambahan
param1
, Anda mendapatkannya.Dan untuk digunakan
param1
dengan cara yang aman, memungkinkan ekspansi tertunda.sumber
&
, solusi Anda hanya berfungsi dengan konten sederhanatest.bat ^&
dan gagal. Hanyatest.bat "&"
berhasil, tapi itu bukan maksud saya. Anda tidak dapat menggunakan%*
,%1
dengan cara yang aman tanpa teknik REM&
dan juga kutipan"
Yap, dan jangan lupa untuk menggunakan variabel seperti
%%1
saat menggunakanif
danfor
dan geng.Jika Anda lupa dobel
%
, maka Anda akan mengganti argumen baris perintah (mungkin nol) dan Anda akan menerima beberapa pesan kesalahan yang cukup membingungkan.sumber
if
danfor
?for %%d in (*) do echo %%d
dari baris perintah:for %d in (*) do echo %d
@for %%2 in (testing) do @echo %%2 %1
dalam file batch, menghasilkantesting 1
ketika dipanggil dengan 1 (test 1
).%%1
tidak mengakses argumen baris perintah, dan itu juga salah untukIF
perintah. HanyaFOR
perintah (dalam file batch) membutuhkan persen ganda, tetapi bahkan kemudian%%1
akan menentukan UNTUK parameter dan tidak argumen aksesTidak perlu menyulitkannya. Ini hanya perintah% 1% 2 parameter, misalnya,
"Jeda" menampilkan apa yang telah dilakukan file batch dan menunggu Anda menekan tombol APA SAJA. Simpan itu sebagai xx.bat di folder Windows.
Untuk menggunakannya, ketik, misalnya:
File batch ini menangani semua parameter yang diperlukan, seperti menyalin file saja, yang lebih baru, dll. Saya telah menggunakannya sejak sebelum Windows. Jika Anda suka melihat nama-nama file, karena mereka sedang disalin, biarkan
Q
parameter.sumber
Seorang teman bertanya kepada saya tentang subjek ini baru-baru ini, jadi saya pikir saya akan memposting bagaimana saya menangani argumen baris perintah dalam file batch.
Teknik ini memiliki sedikit overhead seperti yang akan Anda lihat, tetapi itu membuat file batch saya sangat mudah dimengerti dan cepat diimplementasikan. Serta mendukung struktur berikut:
Jist itu adalah memiliki
:init
,:parse
, dan:main
fungsi.sumber
Catatan: JIKA
"%1"==""
akan menyebabkan masalah jika%1
dilampirkan dalam tanda kutip itu sendiri.Dalam hal ini, gunakan
IF [%1]==[]
atau, dalam NT 4 (SP6) dan hanya nanti,IF "%~1"==""
sebagai gantinya.sumber
Mari kita tetap sederhana ini.
Ini file .cmd.
Berikut adalah 3 panggilan dari baris perintah.
sumber
Ini loop atas parameter batch (% *) baik yang dikutip atau tidak, kemudian gema setiap parameter.
sumber
test.bat *.txt
,test.bat cat^&dog
atauTest.bat /?
Saya menulis skrip read_params sederhana yang dapat disebut sebagai fungsi (atau eksternal
.bat
) dan akan meletakkan semua variabel ke lingkungan saat ini. Itu tidak akan mengubah parameter asli karena fungsi sedangcall
diedit dengan salinan parameter asli.Misalnya, diberikan perintah berikut:
myscript.bat
akan dapat menggunakan variabel setelah memanggil fungsi:Inilah fungsinya:
Keterbatasan
-force
. Anda bisa menggunakan-force=true
tetapi saya tidak bisa memikirkan cara untuk mengizinkan nilai kosong tanpa mengetahui daftar parameter sebelumnya yang tidak akan memiliki nilai.Changelog
-
parameter sebelumnya.sumber
Dalam file batch
Dan di baris perintah, lewati argumen
Output akan menjadi
sumber
Untuk merujuk ke variabel set di baris perintah, Anda harus menggunakannya
%a%
misalnya:Catatan: Ini berfungsi untuk Windows 7 pro.
sumber
Terinspirasi oleh jawaban di tempat lain oleh @ Jon, saya telah membuat algoritma yang lebih umum untuk mengekstraksi parameter bernama, nilai opsional, dan switch.
Mari kita katakan bahwa kita ingin mengimplementasikan suatu utilitas
foobar
. Itu membutuhkan perintah awal. Ini memiliki parameter opsional--foo
yang mengambil nilai opsional (yang tidak bisa menjadi parameter lain, tentu saja); jika nilai tidak ada, defaultnya adalahdefault
. Ini juga memiliki parameter opsional--bar
yang mengambil nilai yang diperlukan . Terakhir dapat mengambil bendera--baz
tanpa nilai yang diizinkan. Oh, dan parameter ini bisa datang dalam urutan apa pun.Dengan kata lain, tampilannya seperti ini:
Ini solusinya:
SETLOCAL
agar variabel tidak keluar ke lingkungan panggilan.SET FOO=
, dll. Seandainya seseorang mendefinisikannya dalam lingkungan panggilan.%~1
untuk menghapus kutipan.IF "%ARG%" == ""
dan bukanIF [%ARG%] == []
karena[
dan]
tidak bermain sama sekali dengan nilai yang berakhir dengan spasi.SHIFT
berada di dalamIF
blok, argumen saat ini seperti%~1
tidak mendapatkan pembaruan karena mereka ditentukan ketikaIF
diuraikan. Anda dapat menggunakan%~1
dan%~2
di dalamIF
blok, tetapi itu akan membingungkan karena Anda punyaSHIFT
. Anda bisa meletakkannyaSHIFT
di ujung blok untuk kejelasan, tetapi itu mungkin akan hilang dan / atau membingungkan orang juga. Jadi "menangkap"%~1
dan di%~1
luar blok sepertinya yang terbaik.IF NOT "%ARG:~0,2%" == "--"
.SHIFT
ketika Anda menggunakan salah satu parameter.SET FOO=%DEFAULT_FOO%
disesalkan, tetapi alternatifnya adalah menambahkan blokIF "%FOO%" == "" SET FOO=%DEFAULT_FOO%
di luarIF NOT "%ARG%" == ""
. Namun karena ini masih dalamIF "%PARAM%" == "--foo"
blok, yang%FOO%
nilai akan telah dievaluasi dan ditetapkan sebelum Anda pernah masuk blok, sehingga Anda tidak akan mendeteksi bahwa kedua yang--foo
parameter hadir dan juga bahwa%FOO%
nilai yang hilang.ECHO Missing bar value. 1>&2
mengirim pesan kesalahan ke stderr.ECHO:
atau salah satu variasi.sumber
Buat file batch baru (contoh: openclass.bat) dan tulis baris ini di file:
Kemudian tempatkan file batch, katakanlah, folder system32, buka file kelas Java Anda, klik kanan, Properties, Open with ..., lalu cari file batch Anda, pilih dan itu ...
Ini bekerja untuk saya.
PS: Saya tidak bisa menemukan cara untuk menutup jendela cmd ketika saya menutup kelas Java. Untuk sekarang...
sumber
start /wait java %~n1
Solusi sederhana (meskipun pertanyaan sudah lama)
Test1.bat
CallTest1.bat
keluaran
Di mana YourLocalPath adalah jalur direktori saat ini.
Untuk menjaga hal-hal sederhana, simpan param perintah dalam variabel dan gunakan variabel untuk perbandingan.
Ini tidak hanya sederhana untuk ditulis tetapi juga mudah untuk dipertahankan sehingga jika nanti orang lain atau Anda membaca skrip Anda setelah jangka waktu yang lama, itu akan mudah dipahami dan dikelola.
Untuk menulis kode sebaris: lihat jawaban lain.
sumber
Obs: Untuk menggunakan tanpa:
?*&<>
sumber
?*&<>