Windowsバッチファイルには%*構造がありますか?


回答:


10

Windowsバッチファイル(Windows XP以降、場合によってはそれ以前)は、 %*は、%1以降のすべてのパラメーターに評価される構成をしています。

残念ながら、これはSHIFTコマンドを尊重しないため、以下は機能しません。

@echo off
set EATEN=%1
shift

call other.bat %*

それでも、最初のパラメーターは2番目のバッチファイルに渡されます。


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%

パラメータの引用符に問題がある可能性があります。

Patrick Cuffへの称賛、https: //stackoverflow.com/questions/382587/how-to-get-batch-file-parameters-from-nth-position-on


1

はい、彼らがやります。

あなたの例は次のように書くことができます:

@echo off
call other.bat %*

また、シフトはウィンドウでサポートされています... これを参照してください。
しかし、実際、その最後のリンクは、シフトが%*と組み合わせて機能しないことを確認しています。

シフト
  シフトで%*を使用しても、%*バッチパラメーターには影響しません。


申し訳ありませんがリンクが悪かった...今すぐ修正する必要があります。
fretje 2009年

(引用)%*をシフトシフトで使用しても、%*バッチパラメーターには影響しません。(/ quote)
ウェッジ

なぜ反対票か。問題はシフトについてではなく、%*についてでした。
fretje 2009年

あなたの最初の答えは「はい、彼らはそうでした」だけでしたが、それは明白なリンク(または答え)ではありませんでした。あなたの最後の編集はまともな答えのはるかに多く、おそらくそれが理由です...
thijs 09/09/06

実際に私がさらに説明を追加した後、反対投票が起こりました。「はい、そうです」のリンクは明白ではなかったが、それは
当面の

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.