Windows批处理文件是否具有%*结构?


Answers:


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)

不管有多少参数,这都有效。



1

是的,他们愿意。

您可以将示例编写如下:

@echo off
call other.bat %*

另外:移支持Windows ...查看
但是确实,最后一个链接确认了shift与%*结合使用无效:

•使用*%与
  已经没有在%。*批次参数的影响。


抱歉,链接不好...应该立即修复。
fretje 2009年

。(报价)使用%*带换档移位上的%没有影响*批次参数(/报价)

为什么要下票?问题是关于%*而不是班次。
fretje 2009年

您的第一个答案只有“是的”,这显然不是链接(或答案)。您的最后编辑更像是一个不错的答案,也许这就是为什么...
thijs

实际上,在我添加了更多解释之后,人们才开始投票。我同意“是的”上的链接不是很明显,但这是对眼前问题的确切答案……
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使用给定的参数:“查询?而且,cls在最终解决方案中也不需要
。– izogfif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.