Aku harus melewati sebuah ID dan password untuk file batch pada saat berjalan daripada hardcoding mereka ke dalam file.
Berikut ini's apa command line terlihat seperti:
test.cmd admin P@55w0rd > test-log.txt
Tip lain yang berguna adalah dengan menggunakan %*
berarti "semua". Misalnya:
echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*
Ketika anda menjalankan:
test-command admin password foo bar
di atas batch file yang akan dijalankan:
fake-command /u admin /p password admin password foo bar
Saya mungkin memiliki sintaks sedikit salah, tapi ini adalah ide umum.
Berikut ini's bagaimana saya melakukannya:
@fake-command /u %1 /p %2
Berikut ini's apa perintah yang terlihat seperti:
test.cmd admin P@55w0rd > test-log.txt
%1
berlaku untuk parameter pertama %2
(dan di sini's bagian yang rumit) berlaku untuk kedua. Anda dapat memiliki hingga 9 parameter yang dikirimkan dengan cara ini.
Mengakses batch parameter dapat sederhana dengan %1, %2, ... %9 atau juga %*, tapi hanya jika konten yang sederhana.
Tidak ada cara sederhana untuk kompleks isi like "&"^&
, seperti's tidak mungkin untuk mengakses %1 tanpa menghasilkan kesalahan.
set var=%1
set "var=%1"
set var=%~1
set "var=%~1"
Garis memperluas untuk
set var="&"&
set "var="&"&"
set var="&"&
set "var="&"&"
Dan masing-masing baris gagal, sebagai salah satu dari &
ini di luar dari kutipan.
Hal itu dapat diatasi dengan membaca dari sebuah file sementara yang kata versi dari parameter.
@echo off
SETLOCAL DisableDelayedExpansion
SETLOCAL
for %%a in (1) do (
set "prompt="
echo on
for %%b in (1) do rem * #%1#
@echo off
) > param.txt
ENDLOCAL
for /F "delims=" %%L in (param.txt) do (
set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'
Caranya adalah dengan mengaktifkan echo on
dan memperluas %1 setelah rem
pernyataan (juga bekerja dengan %2 .. %*
).
Jadi, bahkan "&"&
bisa bergema tanpa menghasilkan kesalahan, seperti yang berkomentar.
Tapi untuk dapat mengarahkan output dari echo on
, anda membutuhkan dua for-loop.
Karakter tambahan * #
yang digunakan harus aman terhadap isi seperti /?
(akan menunjukkan bantuan untuk REM
).
Atau sisipan ^ di garis akhir bisa bekerja sebagai multiline karakter, bahkan di rem
.
Kemudian membaca rem parameter output dari file, tapi hati-hati.
UNTUK /F harus bekerja dengan menunda ekspansi off, yang lain isi dengan "!" akan hancur.
Setelah mengeluarkan karakter tambahan di param1
, anda punya itu.
Dan untuk menggunakan param1
dengan cara yang aman, memungkinkan perluasan tertunda.
Yap, dan hanya don't lupa untuk menggunakan variabel-variabel seperti %%1
ketika menggunakan jika
dan untuk
dan geng.
Jika anda lupa ganda %
, maka anda akan menggantikan (mungkin kosong) argumen baris perintah dan anda akan menerima beberapa cukup membingungkan pesan kesalahan.
Ada tidak perlu untuk mempersulit. Itu hanya perintah %1 %2 parameter, misalnya,
@echo off
xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z
echo copied %1 to %2
pause
&Quot;berhenti" menampilkan apa batch file yang telah selesai dan menunggu anda untuk menekan tombol APA saja. Menyimpan itu sebagai xx.bat dalam folder Windows.
Untuk menggunakannya, jenis, misalnya:
xx c:\f\30\*.* f:\sites\30
File batch ini mengurus semua parameter yang diperlukan, seperti menyalin hanya file yang lebih baru, dll. Saya telah menggunakannya sejak sebelum Windows. Jika anda suka melihat nama-nama file, karena mereka tidak dapat disalin, meninggalkan parameter Q
.
Seorang teman bertanya padaku tentang hal ini baru-baru ini, jadi saya pikir saya'd post bagaimana saya menangani argumen baris perintah pada file batch.
Teknik ini memiliki sedikit overhead seperti anda'll melihat, tapi itu membuat saya batch file sangat mudah untuk memahami dan cepat untuk melaksanakan. Serta mendukung struktur berikut:
>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]
Intinya itu adalah memiliki :init
, :mengurai
, dan main
fungsi.
Contoh penggunaan
>template.bat /?
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.
USAGE:
test.bat [flags] "required argument" "optional argument"
/?, --help shows this help
/v, --version shows the version
/e, --verbose shows detailed output
-f, --flag value specifies a named parameter value
>template.bat <- throws missing argument error
(same as /?, plus..)
**** ****
**** MISSING "REQUIRED ARGUMENT" ****
**** ****
>template.bat -v
1.23
>template.bat --version
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.
>template.bat -e arg1
**** DEBUG IS ON
UnNamedArgument: "arg1"
UnNamedOptionalArg: not provided
NamedFlag: not provided
>template.bat --flag "my flag" arg1 arg2
UnNamedArgument: "arg1"
UnNamedOptionalArg: "arg2"
NamedFlag: "my flag"
>template.bat --verbose "argument #1" --flag "my flag" second
**** DEBUG IS ON
UnNamedArgument: "argument #1"
UnNamedOptionalArg: "second"
NamedFlag: "my flag"
template.bat
@::!/dos/rocks
@echo off
goto :init
:header
echo %__NAME% v%__VERSION%
echo This is a sample batch file template,
echo providing command-line arguments and flags.
echo.
goto :eof
:usage
echo USAGE:
echo %__BAT_NAME% [flags] "required argument" "optional argument"
echo.
echo. /?, --help shows this help
echo. /v, --version shows the version
echo. /e, --verbose shows detailed output
echo. -f, --flag value specifies a named parameter value
goto :eof
:version
if "%~1"=="full" call :header & goto :eof
echo %__VERSION%
goto :eof
:missing_argument
call :header
call :usage
echo.
echo **** ****
echo **** MISSING "REQUIRED ARGUMENT" ****
echo **** ****
echo.
goto :eof
:init
set "__NAME=%~n0"
set "__VERSION=1.23"
set "__YEAR=2017"
set "__BAT_FILE=%~0"
set "__BAT_PATH=%~dp0"
set "__BAT_NAME=%~nx0"
set "OptHelp="
set "OptVersion="
set "OptVerbose="
set "UnNamedArgument="
set "UnNamedOptionalArg="
set "NamedFlag="
:parse
if "%~1"=="" goto :validate
if /i "%~1"=="/?" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="-?" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="--help" call :header & call :usage "%~2" & goto :end
if /i "%~1"=="/v" call :version & goto :end
if /i "%~1"=="-v" call :version & goto :end
if /i "%~1"=="--version" call :version full & goto :end
if /i "%~1"=="/e" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="-e" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="--verbose" set "OptVerbose=yes" & shift & goto :parse
if /i "%~1"=="--flag" set "NamedFlag=%~2" & shift & shift & goto :parse
if not defined UnNamedArgument set "UnNamedArgument=%~1" & shift & goto :parse
if not defined UnNamedOptionalArg set "UnNamedOptionalArg=%~1" & shift & goto :parse
shift
goto :parse
:validate
if not defined UnNamedArgument call :missing_argument & goto :end
:main
if defined OptVerbose (
echo **** DEBUG IS ON
)
echo UnNamedArgument: "%UnNamedArgument%"
if defined UnNamedOptionalArg echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
if not defined UnNamedOptionalArg echo UnNamedOptionalArg: not provided
if defined NamedFlag echo NamedFlag: "%NamedFlag%"
if not defined NamedFlag echo NamedFlag: not provided
:end
call :cleanup
exit /B
:cleanup
REM The cleanup function is only really necessary if you
REM are _not_ using SETLOCAL.
set "__NAME="
set "__VERSION="
set "__YEAR="
set "__BAT_FILE="
set "__BAT_PATH="
set "__BAT_NAME="
set "OptHelp="
set "OptVersion="
set "OptVerbose="
set "UnNamedArgument="
set "UnNamedArgument2="
set "NamedFlag="
goto :eof
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue
Catatan: JIKA "%1"==""
akan menyebabkan masalah jika %1
tertutup dalam tanda kutip itu sendiri.
Dalam hal ini, menggunakan JIKA [%1]==[]
atau, di NT 4 (SP6) dan kemudian hanya, JIKA "%~1"==""
sebagai gantinya.
Let's ini tetap sederhana.
Di sini adalah .cmd file.
@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%
Berikut ini adalah 3 panggilan dari baris perintah.
C:\Users\joeco>echo_3params 1abc 2 def 3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def
C:\Users\joeco>echo_3params 1abc "2 def" "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"
C:\Users\joeco>echo_3params 1abc '2 def' "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'
C:\Users\joeco>
Saya menulis sederhana read_params script yang bisa disebut sebagai fungsi (atau eksternal .bat
) dan akan menempatkan semua variabel ke dalam lingkungan saat ini. Itu tidak't memodifikasi parameter yang asli karena fungsi menjadi `call indonesia dengan salinan asli parameter.
Misalnya, berikan perintah berikut:
myscript.bat some -random=43 extra -greeting="hello world" fluff
myscript.bat
akan dapat menggunakan variabel-variabel setelah memanggil fungsi:
call :read_params %*
echo %random%
echo %greeting%
Berikut ini's fungsi:
:read_params
if not %1/==/ (
if not "%__var%"=="" (
if not "%__var:~0,1%"=="-" (
endlocal
goto read_params
)
endlocal & set %__var:~1%=%~1
) else (
setlocal & set __var=%~1
)
shift
goto read_params
)
exit /B
Keterbatasan
kekuatan
. Anda bisa menggunakan kekuatan- =true
tapi aku bisa't memikirkan cara untuk memungkinkan nilai-nilai kosong tanpa mengetahui daftar parameter dari waktu ke depan yang tidak't memiliki nilai.Changelog
-
sebelum parameter.Terinspirasi oleh sebuah jawaban di tempat lain oleh @Jon, aku telah dibuat yang lebih umum algoritma untuk mengekstrak parameter bernama, opsional nilai-nilai, dan switch.
Mari kita katakan bahwa kita ingin menerapkan sebuah utilitas foobar
. Hal ini membutuhkan sebuah awal perintah. Ia memiliki sebuah parameter opsional --foo
yang mengambil optional nilai (yang tidak bisa menjadi parameter lain, tentu saja); jika nilai yang hilang itu standarnya default
. Ia juga memiliki sebuah parameter opsional --bar
yang mengambil required nilai. Akhirnya ia dapat mengambil bendera --baz
dengan nilai tidak diperbolehkan. Oh, dan parameter-parameter ini dapat datang dalam urutan apapun.
Dengan kata lain, ini terlihat seperti ini:
foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]
Berikut adalah solusinya:
@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson
SET CMD=%~1
IF "%CMD%" == "" (
GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=
SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
SHIFT
IF NOT "%ARG%" == "" (
IF NOT "%ARG:~0,2%" == "--" (
SET FOO=%ARG%
SHIFT
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE (
SET FOO=%DEFAULT_FOO%
)
) ELSE IF "%PARAM%" == "--bar" (
SHIFT
IF NOT "%ARG%" == "" (
SET BAR=%ARG%
SHIFT
) ELSE (
ECHO Missing bar value. 1>&2
ECHO:
GOTO usage
)
) ELSE IF "%PARAM%" == "--baz" (
SHIFT
SET BAZ=true
) ELSE IF "%PARAM%" == "" (
GOTO endargs
) ELSE (
ECHO Unrecognized option %1. 1>&2
ECHO:
GOTO usage
)
GOTO args
:endargs
ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
ECHO Baz
)
REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof
:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1
SETLOCAL
sehingga variabel don't melarikan diri ke menelepon lingkungan.SET FOO=
, dll. dalam hal seseorang ditetapkan mereka di panggil lingkungan.%~1
untuk menghapus tanda kutip.JIKA "%ARG%" == ""
dan tidak JIKA [%ARG%] == []
karena [
dan ]
don't akan bermain sama sekali dengan nilai-nilai yang berakhir di sebuah ruang.SHIFT
dalam sebuah JIKA
block, saat ini args seperti %~1
don't mendapatkan diperbarui karena mereka ditentukan ketika JIKA
diurai. Anda bisa menggunakan %~1
dan %~2
di dalam JIKA
blok, tapi itu akan menjadi membingungkan karena anda telah BERGESER
. Anda bisa menempatkan SHIFT
pada akhir blok untuk kejelasan, tapi itu mungkin tersesat dan/atau membingungkan orang-orang juga. Jadi "menangkap" %~1
dan %~1
di luar blok tampaknya yang terbaik.JIKA TIDAK "%ARG:~0,2%" == "--"
.MENGGESER
ketika anda use salah satu parameter.SET FOO=%DEFAULT_FOO%
disesalkan, tapi alternatif akan menambahkan sebuah JIKA "%M%" == "" SET FOO=%DEFAULT_FOO%
luar JIKA TIDAK "%ARG%" == ""
blok. Namun karena ini masih dalam JIKA "%PARAM%" == "--foo"
block, %M%
nilai yang telah dievaluasi dan ditetapkan sebelum anda pernah masuk ke dalam blok, sehingga anda tidak akan pernah mendeteksi bahwa both yang --foo
parameter hadir and also bahwa %M%
nilai yang hilang.ECHO Hilang bar nilai. 1>&2
mengirimkan pesan kesalahan ke stderr.ECHO:
atau salah satu variasi.Membuat batch file (contoh: openclass.bat) dan menulis baris ini di file:
java %~n1
Kemudian tempat batch file, let's mengatakan, system32 folder, pergi ke Java class file, klik kanan, Properties, Buka dengan..., kemudian menemukan batch file, pilih dan yang's yang...
Ia bekerja untuk saya.
PS: saya dapat't menemukan cara untuk menutup jendela cmd ketika saya menutup kelas Java. Untuk sekarang...
Solusi sederhana(meskipun pertanyaan lebih tua)
Test1.bat
echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause
CallTest1.bat
call "C:\Temp\Test1.bat" pass123
output
YourLocalpath>call "C:\Temp\test.bat" pass123
YourLocalpath>echo off
"Batch started"
"arg1 is pass123"
YourLocalpath>pause
Press any key to continue . . .
Di mana YourLocalPath saat ini path direktori.
Untuk menjaga hal-hal sederhana yang menyimpan perintah param dalam variabel dan menggunakan variabel untuk perbandingan.
Tidak hanya sederhana untuk menulis tetapi sederhana untuk menjaga serta jadi jika kemudian beberapa orang lain atau anda baca naskah anda setelah jangka waktu yang panjang, itu akan menjadi mudah untuk memahami dan mempertahankan.
Untuk menulis kode inline : lihat jawaban yang lain.
Untuk menggunakan looping untuk mendapatkan semua argumen dan murni batch:
@echo off && setlocal EnableDelayedExpansion
set "_cnt=0" && for %%Z in (%*) do (
set "_arg_=%%Z" && set /a "_cnt=!_cnt! + 1" && set "_arg_[!_cnt!]=!_arg_!"
shift && for /l %%l in (!_cnt! 1 !_cnt!) do echo/ The argument n:%%l is: !_arg_[%%l]!
)
goto :eof
kode Anda siap untuk melakukan sesuatu dengan jumlah argumen mana yang dibutuhkan, seperti...
@echo off && setlocal EnableDelayedExpansion
set "_cnt=0" && for %%Z in (%*) do (
set "_arg_=%%Z" && set /a "_cnt=!_cnt! + 1" && set "_arg_[!_cnt!]=!_arg_!"
shift
)
fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt
Dalam batch file
set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%
%1 dan %2 kembali pertama dan kedua argumen nilai-nilai masing-masing.
Dan di baris perintah, lulus arguemt
Directory> batchFileName admin P@55w0rd
Output yang akan
admin
P@55w0rd