Windows Batch,使用空格传递参数

时间:2016-11-14 12:34:36

标签: windows batch-file arguments

我正在忙于编写Windows批处理脚本,而且我对参数有一些问题。

我的批处理脚本如下

@echo off

setlocal EnableDelayedExpansion

:: RETRIEVE ARGS WITH SPACES

set VAR01=%~1
set VAR02=%~2
set VAR03=%~3

:: CONFIRM IT WORKED

echo %VAR01%
echo %VAR02%
echo %VAR03%

endlocal

exit /b

我正在尝试传递包含空格的参数。

run_batch.bat "arg var 01" "arg var 02" "arg var 03"

但是当它运行时我得到了输出

arg var 01
ECHO is off
ECHO is off

为什么它只对第一个参数起作用,如何修复?

代码从未出现过任何问题,似乎存在导致问题的隐形特殊字符。必须是文本编辑器或类似的东西。如何删除此问题?

3 个答案:

答案 0 :(得分:0)

这应该有效:

@echo off

setlocal EnableDelayedExpansion

:: RETRIEVE ARGS WITH SPACES

set VAR01=%~1
set VAR02=%~2
set VAR03=%~3

:: CONFIRM IT WORKED

echo %VAR01%
echo %VAR02%
echo %VAR03%

endlocal

exit /b

错误的部分是:

set VAR01=%~1
set VAR01=%~2
set VAR01=%~3

但应该是:

set VAR01=%~1
set VAR02=%~2
set VAR03=%~3

答案 1 :(得分:0)

一个小例子脚本供您阅读。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

REM EXIT IF NO ARGS RECEIVED
IF "%~1"=="" EXIT

REM SET MINIMUM NUMBER OF ARGS
SET "i=1"

REM RETRIEVE ALL ARGS
:ARGS
SET "VAR0%i%=%~1"
SHIFT
IF NOT "%~1"=="" (
    SET/A i+=1
    GOTO :ARGS
)

REM INFORM NUMBER OF ARGS
CLS
ECHO=THERE WERE %i% ARGS

REM CONFIRM IT WORKED
ECHO=
SET VAR0

REM ALTERNATIVE CONFIRMATION
ECHO=
FOR /L %%A IN (1,1,%i%) DO IF DEFINED VAR0%%A ECHO=!VAR0%%A!

TIMEOUT -1
ENDLOCAL
EXIT

答案 2 :(得分:0)

我认为除了错字之外没有问题。一个非常棘手的方法来显示args并将它们放到我从DosTips.org学到的编号变量中(但是找不到确切的链接)是:

:: Expand-Args.cmd
@Echo off
Set Args=,1=%~1,2=%~2,3=%~3,4=%~4,5=%~5,6=%~6,7=%~7,8=%~8,9=%~9
Set "Args=%*%Args:,="&Set "Arg%"
Set Arg

批处理将运行此输出: Expand-Args one "2 2" three 4 five 6 "7 7" 8 9

Arg1=one
Arg2=2 2
Arg3=three
Arg4=4
Arg5=five
Arg6=6
Arg7=7 7
Arg8=8
Arg9=9
Args=one "2 2" three 4 five 6 "7 7" 8 9

修改为了不干扰双引号中的内容,分隔符comma可能会被替换为不常见的字符,例如ALT + 0127