3

以下代码接受批处理文件的所有命令行参数。在我的例子中,我有大约 30 个命令行参数,它们都是 1、2 或 3 的数字。我将它们放入然后想将它们重新分配给其他字符。我想要每个var,如果是1,就改成/*,如果是2,就改成*/,如果是3,就改成#。

第一部分效果很好,这是我无法获得语法的重新分配的第二部分。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set var!count!=%%i
  set var!count!=!var!count!:1=/*!  <--don't work
  set var!count!=!var!count!:2=*/!  <--don't work
  set var!count!=!var!count!:3=#!   <--don't work
  set /a count=!count!+1
)
4

2 回答 2

2

我认为 jeb 有最简单的解决方案,但还有其他选择。

1) 您可以将 count 的当前值传输到 FOR 变量中。这就是我倾向于这样做的方式。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  for %%N in (!count!) do (
    set "var%%N=%%i"
    set "var%%N=!var%%N:1=/*!"
    set "var%%N=!var%%N:2=*/!"
    set "var%%N=!var%%N:3=#!"
  )
  set /a count+=1
)

2) 可以使用 CALL 来延迟外部变量的扩展,但我不喜欢这个选项,因为正常扩展不如延迟扩展安全。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set "var!count!=%%i"
  call set "var!count!=%%var!count!:1=/*%%"
  call set "var!count!=%%var!count!:2=*/%%"
  call set "var!count!=%%var!count!:3=#%%"
  set /a count+=1
)
于 2012-10-05T12:59:17.607 回答
2

问题是访问数组成员的方式。

在您的情况下,最好的方法似乎是使用临时变量。

SETLOCAL ENABLEDELAYEDEXPANSION
set count=1
FOR %%i IN (%*) DO (
  set "temp=%%i"
  set "temp=!temp:1=/*!"
  set "temp=!temp:2=*/!"
  set "temp=!temp:3=#!"
  set "var!count!=!temp!"
  set /a count+=1
)
于 2012-10-05T06:06:58.617 回答