Apakah file kumpulan Windows memiliki konstruksi% *?

10

Dalam file batch, apakah saya harus melakukan (misalnya) yang berikut ini?

@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Roger Lipscombe
sumber
Mirip dengan $ @ pada Unix
An̲̳̳drew

Jawaban:

10

File batch Windows (sejak Windows XP, tetapi mungkin sebelumnya) mendukung %*konstruk, yang mengevaluasi semua parameter dari% 1 dan seterusnya.

Sayangnya, ini tidak menghormati SHIFTperintah, jadi yang berikut tidak akan berfungsi:

@echo off
set EATEN=%1
shift

call other.bat %*

Itu masih akan meneruskan parameter pertama ke file batch kedua.

Roger Lipscombe
sumber
2
Catatan: %*mempertahankan spasi / kutipan.
Aaron Digulla
10

Anda dapat mengumpulkan semua argumen menggunakan sesuatu seperti:

set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start

:done
(use %args% here)

Ini berfungsi terlepas dari berapa banyak argumen yang ada.

Graeme Perrow
sumber
1

Ya mereka melakukanya.

Anda dapat menulis contoh Anda sebagai berikut:

@echo off
call other.bat %*

Juga: shift didukung di windows ... Lihat ini .
Tapi memang, tautan terakhir itu mengkonfirmasi bahwa shift tidak berfungsi dalam kombinasi dengan% *:

• Menggunakan% * dengan shift
  Shift tidak mempengaruhi parameter% * batch.

fretje
sumber
Tautan maaf salah ... harus diperbaiki sekarang.
fretje
(quote) Menggunakan% * dengan shift Shift tidak memengaruhi parameter% * batch. (/ quote)
Wedge
Mengapa downvote? Pertanyaannya adalah tentang% * bukan tentang perubahan.
fretje
Jawaban pertama Anda hanya memiliki "Ya mereka lakukan" yang bukan tautan yang jelas (atau jawaban). Edit terakhir Anda jauh lebih dari jawaban yang layak, mungkin itu sebabnya ...
thijs
Sebenarnya downvote terjadi setelah saya menambahkan lebih banyak penjelasan. Dan saya setuju bahwa link di "Ya mereka" tidak jelas, tapi itu adalah jawaban yang tepat untuk pertanyaan di tangan ...
fretje
0
@echo off
cls
setlocal enabledelayedexpansion

:: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"].
set "_ENABLE_INFO="
set _DBQ="

set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL (
   if not defined _PARMS.IDX (
      echo Parameter Index^(es^) to extract eg.:
      echo 1 2 5 9 11 39 400
      set /p "_PARMS.IDX=>"
   )
   set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡"
   set "_PARMS.IDX=!_PARMS.IDX:¡¡=!"
   set "_PARMS.IDX=!_PARMS.IDX: =!"
   call :_FN_PROC.STRING %*
%_ENABLE_INFO% goto :FINISH
   goto :eof
) else (
   echo No input parameters.
)
goto :eof


:_FN_PROC.STRING
set "_PARMS.PROCESS.STRING=%*"
:_FN_PROC.STRING.LOOP
set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!"
set /a _PARMS.COUNT+=1
for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do (
   set _PARMS.TMP.CHECK=%%a
   set _PARMS.PROCESS.STRING=%%b
   if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" (
      for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do (
         set _PARMS.TMP.CHECK="%%c"
         set _PARMS.PROCESS.STRING=%%d
      )
   )
)

if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" (
   set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%}
) else (
   set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=!
   set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%]
)

if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=)
if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP)

set _DBQ=
set _PARMS.TMP.CHECK=
if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!)
if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!)
goto :eof


:FINISH
echo.
echo _PARMS.IDX ^:
echo    ¡^=¡ no Parameter Index was specified for extraction.
echo    ¡n¡ nth Parameter was not processed (Index larger than Parameters Count).
echo    [n] nth Parameter was Extracted.
echo    {n} nth Parameter was Ignored (Remaining).
echo.
set _
goto :eof
Dharma Leonardi
sumber
Mempertahankan semua pembatas khusus. Mendukung Parameter sebanyak yang dapat dipasang dalam 8175 karakter per batas baris perintah (termasuk nama file batch, CRLF dan jalur batch jika ditentukan). Parameter dapat dikelompokkan dengan tanda kutip ganda (mis. "Sw1 = / quiet / skip: 1 / start = 3"). Catatan: Kutipan ganda dipertahankan. Perilaku tanda kutip ganda diharapkan (bahkan jika digunakan secara tidak benar, mis. Hanya digunakan secara tunggal atau "" atau ""). Harap debug kode terlebih dahulu sebelum membuat laporan bug.
Dharma Leonardi
Itu jawaban yang sangat rumit yang menunjukkan banyak informasi debug, meskipun tidak langsung menjawab pertanyaan asli: bagaimana call other.batdengan parameter yang diberikan :( Di mana saya menulis "other.bat"? Apakah mungkin untuk menghapus "Indeks parameter untuk mengekstraksi "permintaan? Juga, clstidak diperlukan dalam solusi akhir.
izogfif