cmd での入力例:
test.bat /p 1,3,4
期待される結果:
1
3
4
これまでの私のコード:
@echo off
set arg = %1
set var = %2
if (%1)==(/p) (
... need code that will read and print each character of var
)
cmd での入力例:
test.bat /p 1,3,4
期待される結果:
1
3
4
これまでの私のコード:
@echo off
set arg = %1
set var = %2
if (%1)==(/p) (
... need code that will read and print each character of var
)
あなたの質問には潜在的な問題があります。test.batが次の場合:
@echo %1%
それで
test 1,2,3
プリント:
1
これは、このコンテキストでは、コンマが引数の区切り文字として扱われるためです。
したがって、引用符で囲む必要があります。
test "1,2,3"
または、別の内部区切り文字を使用します。
test 1:2:3
パーツを%2、%3などに配置する場合を除いて、この場合、問題は。を簡単に使用することで解決されますSHIFT
。
私のソリューションでは、グループパラメータ「1,2,3」を引用符で囲むことを選択しました(ただし、delims=,
使用する文字を指定するように変更することで、これを別の区切り文字に簡単に適合させることができます)。
@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set args=%~2
if "%1"=="/p" (
:NextToken
for /F "usebackq tokens=1* delims=," %%f in ('!args!') do (
echo %%f
set args=%%g
)
if defined args goto NextToken
)
次のように呼び出します:
readch.bat /p "1,2,3"
%~2
引用符を削除するために使用されます。
このFOR
ステートメントはargsを解析し、最初のトークンをに入れ、%f
行の残りをに入れます%g
。
`goto NextToken'行は、トークンがなくなるまでループします。
@echo off
if "%1"=="/p" (
:LOOP
echo %2
shift
set arg=%2
if defined arg goto :LOOP else exit >nul
)
set params=%%~2
if (%1)==(/p) (
set params=%params:,= %
)
if "%params%" NEQ "" (
call :printer %params%
)
goto :eof
:printer
:shifting
if "%%1" NEQ "" (
echo %%1
) else (
goto :eof
)
shift
goto :shifting
goto :eof