Apakah file kumpulan Windows memiliki konstruksi% *?


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.


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.



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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.