У пакетных файлов Windows конструкция% *?

10

В командном файле я должен сделать (например) следующее?

@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Роджер Липскомб
источник
Подобно $ @ в Unix
An̲̳̳drew 21.10.10

Ответы:

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
источник
Извините ссылки были плохими ... должны быть исправлены сейчас.
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