Pertanyaan Bagaimana cara meneruskan parameter baris perintah ke file batch?


Saya harus mengirimkan id dan kata sandi ke file cmd (atau kelelawar) pada saat menjalankan daripada meng-hardcoding mereka ke dalam file.

Inilah yang tampak seperti baris perintah:

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

904
2017-08-25 18:14


asal


Jawaban:


Tip berguna lainnya 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 foo bar

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


805
2017-08-25 19:41



Begini cara saya melakukannya.

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

Inilah yang tampak seperti baris perintah:

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

% 1 berlaku untuk parameter pertama% 2 (dan inilah bagian yang rumit) berlaku untuk yang kedua. Anda dapat memiliki hingga 9 parameter yang dilewatkan dengan cara ini.


225
2017-09-18 12:26



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

117
2017-08-25 20:03



Mengakses parameter batch dapat sederhana dengan% 1,% 2, ...% 9 atau juga% *,
tetapi hanya jika isinya sederhana.

Tidak ada cara sederhana untuk konten yang rumit seperti "&"^&, karena tidak mungkin mengakses% 1 tanpa menghasilkan kesalahan.

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

Garis-garis meluas ke

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

Dan setiap baris gagal, sebagai salah satu dari & berada di luar tanda kutip.

Ini bisa diselesaikan dengan membaca dari file sementara a berkomentar versi 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!'

Triknya adalah mengaktifkan echo on dan memperluas% 1 setelah rem pernyataan (berfungsi juga dengan% 2 ..% *).
Begitu pun "&"& dapat digemakan tanpa menghasilkan kesalahan, seperti yang dikemukakan.

Tetapi untuk dapat mengarahkan output dari echo on, Anda membutuhkan dua FOR-LOOPS.

Karakter ekstra * # digunakan agar aman terhadap konten seperti /? (akan menunjukkan bantuan untuk REM).
Atau caret ^ pada ujung garis bisa berfungsi sebagai karakter multiline, bahkan setelah a rem.

Kemudian membaca parameter rem output dari file, tetapi hati-hati.
FOR / F harus bekerja dengan ekspansi tertunda, yang lain isi dengan "!" akan hancur.
Setelah menghapus karakter tambahan di param1, Anda mendapatkannya.

Dan untuk menggunakan param1 dengan cara yang aman, aktifkan ekspansi yang tertunda.


71
2018-03-30 22:16



Ya, dan jangan lupa untuk menggunakan variabel seperti %%1 ketika menggunakan if dan for dan geng.

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


51
2017-08-25 18:16



Tidak perlu mempersulitnya. Ini hanyalah 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 untuk menekan tombol APA PUN. 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, tinggalkan Q parameter.


45
2018-04-18 23:46



@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

Catatan: IF "%1"=="" akan menimbulkan masalah jika %1 tertutup dalam tanda kutip itu sendiri.

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


30
2018-03-14 06:02



Seorang teman bertanya kepada saya tentang hal 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 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][...]

The jist of it adalah memiliki :init, :parse, 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

23
2017-07-13 03:32



Mari kita tetap sederhana ini.

Ini adalah 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>

18
2017-12-31 17:59