У пакетных файлов 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%

Могут быть проблемы с кавычками в параметрах.

Слава Патрику Каффу, /programming/382587/how-to-get-batch-file-parameters-from-nth-position-on


1

Да, они делают.

Вы можете написать свой пример следующим образом:

@echo off
call other.bat %*

Кроме того: сдвиг поддерживается на окнах ... Смотрите это .
Но действительно, эта последняя ссылка подтверждает, что сдвиг не работает в сочетании с% *:

• Использование% * со сдвигом
  Shift не влияет на пакетный параметр% *.


Извините ссылки были плохими ... должны быть исправлены сейчас.
— fretje

(цитата) Использование% * со смещением Shift не влияет на пакетный параметр% *. (/ quote)
— Клин

Почему отрицательный голос? Вопрос был о% *, а не о смене.
— fretje

В вашем первом ответе было только «Да, они делают», что не было очевидной ссылкой (или ответом). Ваше последнее редактирование гораздо более достойного ответа, может быть, поэтому ...
— Тайс

На самом деле понижение произошло после того, как я добавил больше объяснений. И я согласен с тем, что ссылка «Да, они делают» не была очевидной, но это был точный ответ на рассматриваемый вопрос ...
— 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

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

Это очень сложный ответ, показывающий много отладочной информации, хотя он не дает прямого ответа на исходный вопрос: как call other.batс данными параметрами :( Где я могу написать «other.bat»? Можно ли удалить «Индекс (ы) параметра для извлечения» "запрос? Кроме того, clsне требуется в окончательном решении.
— izogfif
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.