2016-12-07 3 views
2

コマンドラインからバッチスクリプトにいくつかの引数を渡しています。 Like:myfile.bat flower, tree, doge, cate, house しかし、引数リストの長さは動的であり、常に5ではありません。 nからlastまでのすべての引数を取得するにはどうしたらいいですか? たとえば、nが2の場合、doge、cate、houseを取得するにはどうすればよいですか。 コメントの質問に基づいて編集します。コマンドラインで渡されたすべての引数を特定のインデックスから末尾のスクリプトに参照します。

+0

本当の質問は何ですか?最後の 'n'引数、fron' n'を 'last'にしたいのですか、それとも何ですか? – elzooilogico

+0

はい、正確にnから最後まで – TBogdan

答えて

1
@ECHO OFF 
SETLOCAL 
SET /a skipargs=2 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 

SET /a skipargs=1 
SET "destvar=somevarname" 

CALL :getargs %* 

SET somevarname 


GOTO :EOF 

:getargs 
IF %skipargs% gtr 0 SET /a skipargs-=1&shift&GOTO getargs 
SET "%destvar%=" 
:getargsl 
IF DEFINED %destvar% (CALL SET "%destvar%=%%%destvar%%% %1" 
) ELSE (
SET "%destvar%=%1" 
) 
SHIFT 
IF "%~1" neq "" GOTO getargsl 
GOTO :eof 

これは、すべての引数の変数にn番目の後を割り当てる方法を示さなければなりません。

0

これは少し単純に、(少なくとも私にとっては)を思わ

@echo off 

set/a skip=1 & rem set skip to the number of arguments to forget 
for /L %%i in (1,1,%skip%) do shift & rem skip arguments 

:getArg 
echo %~1 & shift 
if "%~1" neq "" goto :getArg 
exit/B  
+0

このコードスニペットは質問を解決するかもしれませんが[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)あなたの投稿の質を向上させる。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – kayess

-2

を試してみてください。ここ

+1

これは、 'for/F'が引用符を適切に処理しないので、これが引数を間違って解析するのではないかと思います。 *スペース*、*タブ*、 '、'、 ';'、 '='と*非区切りスペース*(コード '0xFF')... – aschipfl

+0

Do not be恐れて...私の答えは、質問された質問と完璧に動作し、私はさらに編集前のバージョンをチェックしました。 ''花 ''、 '' doge''、ca; te、ho = use'と完全にうまくいっているはずです。私が間違っていない場合、上記のコメントには両方ともコンマが含まれているため、間違っていることを意味します。私は、私の答えが適切ではないが、質問のパラメータ内で100%働くシナリオがあることを認めます。 – Compo

+1

あなたのアプローチは、 '' floow ''を' 'flo'と' wer "'の2つの別々の項目として解析します。しかし、 'cmd'はquotationのために' 'floow''を1つの引数として扱います。それは私が言及していたものです。もちろん、あなたのコードは質問の例で動作しますが、実際の状況では失敗する可能性があります... – aschipfl

0

を必要に応じて

@Echo Off 
Set "n=2" 
For /F "Tokens=%n%*" %%A In ("%*") Do Set "remainder=%%B" 
Echo(%remainder% 
Timeout -1 

変更2行目に、変数nの値が(これは最初_NUMSKIP引数が、すべてを表示する)%*forループを使用してオプションである:

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     endlocal 
     echo(%%A 
    ) else endlocal 
) 

これはすべての文字列に対して安全ではないことに注意してください。たとえば、引数&"&"は構文エラーを引き起こします。


実行へ後で転送するための単一の行の残りの引数を収集するために、これが役立つ:なる元の引数の区切り文字は、単一SPACE各により置換こと

@echo off 
set /A "_NUMSKIP=2" 
set /A "INDEX=0" & set "ARGS= " 
for %%A in (%*) do (
    set /A "INDEX+=1" 
    set "ARGV=%%A" 
    setlocal EnableDelayedExpansion 
    if !INDEX! GTR %_NUMSKIP% (
     for /F "delims=" %%B in (^""!ARGS!!ARGV!"^") do (
      endlocal 
      set "ARGS=%%~B " 
     ) 
    ) else endlocal 
) 
setlocal EnableDelayedExpansion 
echo(!ARGS:~1,-1! 
endlocal 

注意。

+0

これは引数を間違って解析し、この "花"、t、ree、 "doge"、ca; te、ho = use'を使って見ています。その出力は、それぞれのスペースが新しい行を意味する 'ree" doge "ca te ho use"です。しかし、私はすべての答えが未知の入力パラメータのセットで完全に動作するとは期待していません。 BTW、n = 2を使用して他の2つの答えも上記の入力で動作しません! – Compo

+0

@Compoここでは構文解析が正しいので、別々の行の 'echo'出力は引数を表示するだけです。もちろん、それらは1つの変数にまとめられていても、1つの行に出力することができます - [編集の回答](http://stackoverflow.com/revisions/41018823/2)... – aschipfl

+0

-投票... – aschipfl

関連する問題