2

私は、私が望むように正確に動作する次のコードを書きました:

@echo off
setlocal enabledelayedexpansion

set /a i=0
set in="This is line 1", "This is line 2"
for %%h in (%in%) do (
   set /a i+=1
   set "val[!i!]=%%h"
)
set out=
for /l %%n in (1,1,!i!) do (
  set out=!out! !val[%%n]! ^& vbcrlf ^& _)
echo !out:~1,-12!

%in% 変数の値を取得し、コンマで区切られた各行を配列の要素に読み取ってから、文字列連結を行い、新しい文字列を吐き出します。ここで、関数に変換しようとすると、%2 が引数として解析されているために失敗します。%2 を、可変量の値を持つ単一のコンマ区切り文字列として解析する必要があります。この単純なテストは機能しません:

call :Test Title "This is line 1","This is line 2" "arg3"
exit /b

:Test arg1 arg2 arg3
set /a i=0
for %%h in (%2) do (
   set /a i+=1
   set "val[!i!]=%%h"
)
set out=
for /l %%n in (1,1,!i!) do (
  set out=!out! !val[%%n]! ^& vbcrlf ^& _)
echo %1 !out:~1,-12! %3
exit /b

私が考えることができる唯一のことは、 %* を使用して区切り文字を一意のものに変更することですが、可能であればそれを避けたいと思います.

4

2 に答える 2

3

1.ミドルパラメータをシフトする

これはそのままに%1して、中間のすべてのパラメーターがなくなると停止し、最後のパラメーターを に残してシフトします%3

@echo off
setlocal
call :Test One "Two","Three" Four
endlocal
exit /b 0

:Test <Title> <Lines...> <LastArg>
echo %2
set "Temp=%4"
if defined Temp shift /2 & goto Test
echo %1
echo %3
exit /b 0

出力

"Two"
"Three"
One
Four

2.文字列を変数に入れ、変数名を渡します

@echo off
setlocal EnableDelayedExpansion
set "String="Two","Three""
call :Test One String Four
endlocal
exit /b 0

:Test <a> <b> <c>
echo %1
echo !%2!
echo %3
exit /b 0

出力

One
"Two","Three"
Four

これらは、私の頭に浮かぶ最初の 2 つのソリューションです。

アップデート

これは、内側のループを使用してコードに適用される shift メソッドです。:__Test

@echo off
setlocal EnableDelayedExpansion
call :Test Title "This is line 1","This is line 2" "arg3"
endlocal
exit /b 0

:Test <arg1> <arg2[,...]> <arg3>
set "i=0"
:__Test
set /a "i+=1"
set "val[!i!]=%2"
set "tempvar=%4"
if defined tempvar shift /2 & goto __Test
set "out="
for /l %%n in (1,1,!i!) do (
  set out=!out! !val[%%n]! ^& vbcrlf ^& _)
echo %1 !out:~1,-12! %3
exit /b 0
于 2013-11-06T14:49:57.217 に答える