【问题标题】:Read each character of argument in a batch file读取批处理文件中参数的每个字符
【发布时间】:2012-11-22 23:46:38
【问题描述】:
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
)
【问题讨论】:
标签:
batch-file
arguments
parameter-passing
command-line-arguments
【解决方案1】:
您的问题可能存在问题。如果 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' 行循环直到没有更多的标记。
【解决方案2】:
@echo off
if "%1"=="/p" (
:LOOP
echo %2
shift
set arg=%2
if defined arg goto :LOOP else exit >nul
)
【解决方案3】:
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