Чи мають пакетні файли 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.