Чи мають пакетні файли Windows конструкцію% *?


Відповіді:


10

Пакетні файли Windows (починаючи з Windows XP, але можливо і раніше) підтримують %*конструкцію, яка оцінює всі параметри від% 1 і далі.

На жаль, це не вшановує SHIFTкоманду, тому наступне не працюватиме:

@echo off
set EATEN=%1
shift

call other.bat %*

Він все одно передасть перший параметр другому пакетному файлу.


2
Примітка: %*зберігає пробіли / цитати.
Аарон Дігулла

10

Ви можете зібрати всі аргументи разом, використовуючи щось на зразок:

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

:done
(use %args% here)

Це працює незалежно від кількості аргументів.


2

Якщо ви хочете пропустити перші 3 параметри, наприклад, і передати решту:

@echo off
for /f "tokens=1-3*" %%a in ("%*") do (
   set par1=%%a
   set par2=%%b
   set par3=%%c
   set therest=%%d
   )

call other.bat %therest%

Можуть виникнути проблеми з цитатами в параметрах.

kudos Patrick Cuff, /programming/382587/how-to-get-batch-file-parameters-from-nth-position-on


1

Так вони роблять.

Ви можете написати свій приклад так:

@echo off
call other.bat %*

Також: shift підтримується на Windows ... Дивіться це .
Але дійсно, це останнє посилання підтверджує, що зсув не працює в поєднанні з% *:

• Використання% * зі зрушенням
  Shift не впливає на параметр партії% *.


Вибачте, посилання були поганими ... зараз слід виправити.
fretje

(цитата) Використання% * зі зміщенням Shift не впливає на параметр партії% *. (/ цитата)
Wedge,

Чому потік? Питання було про% *, а не про зміну.
fretje

У Вашій першій відповіді було лише "Так, вони є", що не було очевидною ланкою (або відповіддю). Ваша остання редакція є набагато більш гідною відповіддю, можливо, саме тому ...
Thijs

Насправді голосування відбулося після того, як я додав більше пояснень. І я погоджуюся, що посилання на "Так вони роблять" не було очевидним, але це була точна відповідь на питання, яке
підходить

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

Зберігає всі спеціальні роздільники. Підтримує стільки параметрів, скільки можуть бути встановлені в 8175 символів на ліміт командного рядка (включаючи назву пакетного файлу, CRLF та пакетний шлях, якщо зазначено). Параметри можна згрупувати з подвійними лапки (напр., "Sw1 = / тихо / пропустити: 1 / початок = 3"). Примітка: Подвійні цитати зберігаються. Поведінка подвійних лапок очікується (навіть якщо вони використовуються неправильно, наприклад, використовуються лише окремо або "" або ""). Спочатку налагодьте код перед тим, як скласти звіт про помилку.
Дхарма Леонарді

Це дуже детальна відповідь, що показує багато інформації про налагодження, хоча вона не відповідає безпосередньо на вихідне запитання: як call other.batіз заданими параметрами :( Де я пишу "other.bat"? Чи можна видалити "Індекс (и) параметрів для вилучення "запит? Крім того, clsне потрібен в остаточному рішенні.
izogfif
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.