使用批处理文件多年后,我惊讶地发现等号'='被认为是参数分隔符。分析包含=
鉴于这种测试脚本:
echo arg1: %1
echo arg2: %2
echo arg3: %3
和调用:
test.bat a=b c
输出为:
arg1: a
arg2: b
arg3: c
这是为什么和如何能避免?我不希望剧本的用户解释这个怪癖并引用“a = b”,这是违反直觉的。
此批处理脚本是在Windows 7
=====编辑=====
运行多一点背景:写一个bat文件时启动Java我遇到了这个问题应用。我想在bat文件中使用一些参数,然后将剩下的传给java应用程序。所以我第一次尝试做shift
,然后重建参数列表(因为%*
不受shift
的影响)。它看起来是这样的,这时候我发现了问题:
rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
set ARGS=!ARGS! %1
shift
goto args
)
下一步是不使用转向了,但通过一次从%*
删除一个字符,直到一个空间,而实现由指针偏移遇到:
rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto remove_first_done
:remove_first
if not defined ARGS goto remove_first_done
if "%ARGS:~0,1%" == " " goto remove_first_done
set ARGS=%ARGS:~1%
goto remove_first
:remove_first_done
但这是丑陋的,在某些情况下,我可能还没有考虑失败。所以最后我决定编写一个Java程序来处理参数解析!在我的情况下,这很好,因为我启动了一个服务器,额外的Java调用的惩罚是最小的。令人难以置信的是,有时你最终会做什么。
您可能想知道为什么我没有照顾Java应用程序本身的参数?答案是我希望能够传递像-Xmx这样的JVM选项,这些选项在调用java之前必须被处理。
逗号,分号和等号是命令参数和FOR集的分隔符。通过分隔符的唯一方法是用引号括起来:test“a = b”c – Aacini
使用'enabledelayedexpansion'并假定第一个参数仍在%1中,相当干净的解决方案可能如下所示: 'setlocal enabledelayedexpansion& set args =%*& if'%1“==”%KNOA_PROFILE%“(\t set args =!args:%1 =!)'_split lines on'&',我无法输入多行comments_ – eremmel