Bagaimana saya bisa meneruskan argumen ke file batch?

1167

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
Keng
sumber
8
Untuk "sisanya" lihat komentar Greg Hegill tentang cara mendapatkan parameter file batch dari posisi ke-N pada?
matt wilkie
Saya memiliki skrip startup lingkungan yang akan mendorong nama pengguna / kata sandi saya ke variabel lingkungan ... jadi saya tidak harus mengetiknya setiap kali ... Saya menggunakan bash sebagian besar waktu (linux, mac dan windows), dan perlu menggunakannya untuk konfigurasi proxy dalam skrip, dll untuk bekerja.
Tracker1

Jawaban:

1032

Tip lain yang bermanfaat adalah menggunakan %*berarti "semua". Sebagai contoh:

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

file batch di atas akan berjalan:

fake-command /u admin /p password admin password foo bar

Saya mungkin memiliki sintaks yang sedikit salah, tetapi ini adalah ide umum.

Greg Hewgill
sumber
123
% * sebenarnya diperluas ke semua parameter terlepas dari perubahan. Jadi, bahkan setelah dua shift Anda masih akan memiliki dua argumen pertama di% *. Anda dapat menggunakan sesuatu seperti ini: stackoverflow.com/questions/761615/… untuk mendapatkan variabel yang berisi segalanya kecuali parameter n pertama.
Joey
1
Harap perhatikan bahwa% * tidak berfungsi di mana-mana! Misalnya, ini tidak bekerja dengan DOSBox 0.73 (mungkin ini adalah bug yang harus dilaporkan).
Denilson Sá Maia
28
Ini bukan bug karena% * tidak pernah bekerja di MS-DOS atau Win9x.
Kef Schecter
Saya pikir shift"muncul" argumen dari daftar. Asumsi oleh OP adalah bahwa %*hanya akan menghasilkan argumen yang tersisa, tetapi tidak berfungsi seperti itu, seperti kata @ Joey.
NathanAldenSr
5
Jawaban ini salah. Ini sebenarnya menghasilkan fake-command /u admin /p password admin password foo bar. Ini ditunjukkan oleh @ Joey bertahun-tahun yang lalu.
jwdonahue
286

Begini cara saya melakukannya:

@fake-command /u %1 /p %2

Begini tampilannya:

test.cmd admin P@55w0rd > test-log.txt

Yang %1berlaku 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.

Keng
sumber
16
Jika Anda sama bodohnya dengan saya, pikiran Anda sedang mencari echo %1 %2dan terlempar oleh kasing sederhana yang tidak dapat dilekatkan dengan @dan fake-commanddengan params, berpikir kami akan mendapatkan fake-command.batkonten nanti (dalam hal ini, terlalu rumit fake-command.batmungkin harus echo %2 %4mengabaikan nama-nama param). Salah, doofus. TL; DR: Jangan sebodoh saya. 1. echo echo %1 %2 > test.bat2 test word1 word2.. 3. Keuntungan.
ruffin
143

Jika Anda ingin secara cerdas menangani parameter yang hilang, Anda dapat melakukan sesuatu seperti:

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1
thelsdj
sumber
2
Apa pentingnya titik / periode dalam operasi kesetaraan ini?
Chris
4
Pada dasarnya jika% 1 kosong, ini akan menjadi IF. ==. dan GOTO akan terjadi. Kami menggunakan x di sini jadi: JIKA x% 1 == x -> JIKA x == x -> true
Carl
1
Anda harus meminta untuk apa nilai "argumen yang tidak terbukti"? Terhadap apa Anda harus memeriksa "argumen yang tidak terbukti"? Kemudian, jika Anda tidak memiliki jawaban, Anda harus menggunakan trik seperti salah satu dari titik-titik itu. Ingat bahwa, seperti yang dinyatakan di sini ss64.com/nt/if.html "Anda sebenarnya dapat menggunakan hampir semua karakter untuk tanda kurung '~' atau keriting, {} atau bahkan angka 4, tetapi tanda kurung siku cenderung dipilih karena mereka tidak memiliki makna khusus. "
Adriano GV Esposito
89

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.

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

Garis melebar ke

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

Dan setiap baris gagal, karena salah satu di &luar tanda kutip.

Ini dapat diatasi dengan membaca dari file sementara versi parameter yang dikomentari .

@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 ondan memperluas% 1 setelah rempernyataan (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 untuk REM).
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 param1dengan cara yang aman, memungkinkan ekspansi tertunda.

jeb
sumber
untuk / F "token = *" %% a in ('echo% *') lakukan set "all_args = %% a"
Kevin Edwards
@KevinEdwards Lalu coba dengan satu &, solusi Anda hanya berfungsi dengan konten sederhana
jeb
@ KevinEdwards saya mengujinya, test.bat ^&dan gagal. Hanya test.bat "&"berhasil, tapi itu bukan maksud saya. Anda tidak dapat menggunakan %*, %1dengan cara yang aman tanpa teknik REM
jeb
Ah, ya, tanda sisipan tidak menghindarinya dengan benar. Anda perlu penawaran, yang layak untuk semua kasus penggunaan yang saya temui. Saya hanya ingin meneruskannya. Terima kasih telah mengujinya! Cheers :)
Kevin Edwards
2
@ jwdonahue Ya, ini rumit (tapi tidak terlalu rumit). Tetapi terutama untuk kata sandi itu mungkin perlu, setidaknya beberapa kata sandi saya mengandung ampersand &dan juga kutipan"
jeb
59

Yap, dan jangan lupa untuk menggunakan variabel seperti %%1saat menggunakan ifdan fordan geng.

Jika Anda lupa dobel %, maka Anda akan mengganti argumen baris perintah (mungkin nol) dan Anda akan menerima beberapa pesan kesalahan yang cukup membingungkan.

Frank Krueger
sumber
%% hanya untuk ifdan for?
Royi Namir
25
Lebih buruk dari itu - %% digunakan untuk awalan variabel dan parameter baris perintah di dalam file batch. Tetapi ketika Anda menggunakan perintah-perintah ini dari baris perintah, Anda hanya menggunakan% untuk awalan. Contoh: di dalam kumpulan: for %%d in (*) do echo %%ddari baris perintah:for %d in (*) do echo %d
Steve Midgley
11
@SteveMidgley Saya membatalkan komentar Anda mungkin sekitar setahun yang lalu. Saya kemudian segera lupa tentang hal itu dan hari ini saya mencoba dan menatap saya bingung untuk loop di baris perintah dan bertanya-tanya mengapa kentut dan tidak melakukan apa-apa lagi. Jadi inilah upvote virtual lain dari saya. Saya akan kembali sekitar satu tahun lagi ketika saya mengalami masalah yang sama lagi.
icc97
Kami biasanya menyimpan digit untuk pemrosesan baris perintah dan persen ganda hanya berlaku untuk pernyataan untuk sejauh yang saya tahu. @for %%2 in (testing) do @echo %%2 %1dalam file batch, menghasilkan testing 1ketika dipanggil dengan 1 ( test 1).
jwdonahue
2
Jawabannya salah. %%1tidak mengakses argumen baris perintah, dan itu juga salah untuk IFperintah. Hanya FORperintah (dalam file batch) membutuhkan persen ganda, tetapi bahkan kemudian %%1akan menentukan UNTUK parameter dan tidak argumen akses
jeb
51

Tidak perlu menyulitkannya. Ini 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

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

xx c:\f\30\*.* f:\sites\30

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

DearWebby
sumber
41

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:

>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]

Jist itu adalah memiliki :init, :parse, dan :mainfungsi.

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
wasatchwizard
sumber
32
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

Catatan: JIKA "%1"==""akan menyebabkan masalah jika %1dilampirkan dalam tanda kutip itu sendiri.

Dalam hal ini, gunakan IF [%1]==[]atau, dalam NT 4 (SP6) dan hanya nanti, IF "%~1"==""sebagai gantinya.

waktu kode tepat
sumber
Cukup benar, tetapi hampir tidak menyentuh pokok pembicaraan.
jwdonahue
22

Mari kita tetap sederhana ini.

Ini file .cmd.

@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 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>
Cinta dan kedamaian - Joe Codeswell
sumber
20
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

Ini loop atas parameter batch (% *) baik yang dikutip atau tidak, kemudian gema setiap parameter.

Amr Ali
sumber
Tapi gagal dengan banyak argumen yang berbeda, seperti test.bat *.txt, test.bat cat^&dogatauTest.bat /?
jeb
19

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 sedang calldiedit dengan salinan parameter asli.

Misalnya, diberikan perintah berikut:

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat akan dapat menggunakan variabel setelah memanggil fungsi:

call :read_params %*

echo %random%
echo %greeting%

Inilah fungsinya:

: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

  • Tidak dapat memuat argumen tanpa nilai seperti -force. Anda bisa menggunakan -force=truetetapi saya tidak bisa memikirkan cara untuk mengizinkan nilai kosong tanpa mengetahui daftar parameter sebelumnya yang tidak akan memiliki nilai.

Changelog

  • 2/18/2016
    • Tidak lagi membutuhkan ekspansi yang tertunda
    • Sekarang bekerja dengan argumen baris perintah lainnya dengan mencari -parameter sebelumnya.
Evan Kennedy
sumber
Telah melihat menggunakan metode ini karena saya ingin meneruskan argumen ke file batch dengan cara ini. Namun saya perhatikan bahwa setelah variabel ditetapkan, bahkan setelah keluar dari file batch parameter masih diatur dalam cmd jika diakses dan batch telah berakhir, mereka tidak dikembalikan ke keadaan sebelumnya. Haruskah metode ini menangani situasi itu?
Jono_2007
Pada topik dan lebih baik daripada beberapa sisa jawaban di utas ini.
jwdonahue
Diperpanjang untuk mendukung flag args (tanpa nilai). Maaf karena tidak memformat tetapi tidak berfungsi dalam komentar: read_params jika tidak% 1 / == / (jika tidak "% __ var%" == "" (jika tidak "% __ var: ~ 0,1%" == "-" (read_params goto endlocal) endlocal & set% __ var: ~ 1% =% ~ 1) lain (setlocal & set __var =% ~ 1) goto read_params) yang lain (jika tidak "% __ var%" == "" (endlocal & set% __ var: ~ 1% = 1))
Maks
13

Dalam file batch

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

% 1 dan% 2 masing-masing mengembalikan nilai argumen pertama dan kedua.

Dan di baris perintah, lewati argumen

Directory> batchFileName admin P@55w0rd 

Output akan menjadi

admin
P@55w0rd
Bapak baptis
sumber
9

Untuk merujuk ke variabel set di baris perintah, Anda harus menggunakannya %a%misalnya:

set a=100 
echo %a%  
rem output = 100 

Catatan: Ini berfungsi untuk Windows 7 pro.

CMS_95
sumber
6

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 --fooyang mengambil nilai opsional (yang tidak bisa menjadi parameter lain, tentu saja); jika nilai tidak ada, defaultnya adalah default. Ini juga memiliki parameter opsional --baryang mengambil nilai yang diperlukan . Terakhir dapat mengambil bendera --baztanpa nilai yang diizinkan. Oh, dan parameter ini bisa datang dalam urutan apa pun.

Dengan kata lain, tampilannya seperti ini:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

Ini 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
  • Gunakan SETLOCALagar variabel tidak keluar ke lingkungan panggilan.
  • Jangan lupa untuk menginisialisasi variabel SET FOO=, dll. Seandainya seseorang mendefinisikannya dalam lingkungan panggilan.
  • Gunakan %~1untuk menghapus kutipan.
  • Gunakan IF "%ARG%" == ""dan bukan IF [%ARG%] == []karena [dan ]tidak bermain sama sekali dengan nilai yang berakhir dengan spasi.
  • Bahkan jika Anda SHIFTberada di dalam IFblok, argumen saat ini seperti %~1tidak mendapatkan pembaruan karena mereka ditentukan ketika IFdiuraikan. Anda dapat menggunakan %~1dan %~2di dalam IFblok, tetapi itu akan membingungkan karena Anda punya SHIFT. Anda bisa meletakkannya SHIFTdi ujung blok untuk kejelasan, tetapi itu mungkin akan hilang dan / atau membingungkan orang juga. Jadi "menangkap" %~1dan di %~1luar blok sepertinya yang terbaik.
  • Anda tidak ingin menggunakan parameter sebagai pengganti nilai opsional parameter lain, jadi Anda harus memeriksanya IF NOT "%ARG:~0,2%" == "--".
  • Berhati-hatilah hanya SHIFTketika Anda menggunakan salah satu parameter.
  • Kode duplikat SET FOO=%DEFAULT_FOO%disesalkan, tetapi alternatifnya adalah menambahkan blok IF "%FOO%" == "" SET FOO=%DEFAULT_FOO%di luar IF NOT "%ARG%" == "". Namun karena ini masih dalam IF "%PARAM%" == "--foo"blok, yang %FOO%nilai akan telah dievaluasi dan ditetapkan sebelum Anda pernah masuk blok, sehingga Anda tidak akan mendeteksi bahwa kedua yang --fooparameter hadir dan juga bahwa %FOO%nilai yang hilang.
  • Catatan yang ECHO Missing bar value. 1>&2mengirim pesan kesalahan ke stderr.
  • Ingin baris kosong di file kumpulan Windows? Anda harus menggunakan ECHO:atau salah satu variasi.
Garret Wilson
sumber
4

Buat file batch baru (contoh: openclass.bat) dan tulis baris ini di file:

java %~n1

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

SvenVP
sumber
Anda dapat menutup jendela cmd setelah proses ditutup menggunakan perintah berikut dalam skrip batch:start /wait java %~n1
Paint_Ninja
1
Memberi saran kepada publik untuk meletakkan file skrip acak di direktori system32 tidak bertanggung jawab. Jawaban ini benar-benar tidak menggores permukaan topik utas ini.
jwdonahue
2

Solusi sederhana (meskipun pertanyaan sudah lama)

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

keluaran

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

Amol Patil
sumber
2

masukkan deskripsi gambar di sini

Untuk menggunakan perulangan dapatkan semua argumen dan dalam batch murni:

Obs: Untuk menggunakan tanpa:?*&<>


@echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && (
     call set "_arg_[!_cnt!]=!_arg_!" && 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 nomor argumen yang diperlukan, seperti ...

 @echo off && setlocal EnableDelayedExpansion

 for %%Z in (%*)do set "_arg_=%%Z" && set/a "_cnt+=1+0" && call set "_arg_[!_cnt!]=!_arg_!"
 )

 fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt
Bukan Aku
sumber
1
Tetapi gagal, ketika kata sandi berisi karakter?*&<>
jeb
@ jeb Terima kasih lagi, saya telah menambahkan note obs.: untuk menjawab hingga edit baru untuk menangani karakter ini ...
It Wasn't Me