【问题标题】:Parse multiple arguments inside a batch file.解析批处理文件中的多个参数。
【发布时间】:2012-04-13 10:01:34
【问题描述】:

我想读取两个传递给批处理文件的参数。批处理文件将使用 CreateProcess 方法从 C++ 程序中执行。批处理文件的第二个参数是文件夹路径,因此如果我传递第二个参数(例如“E:\test folder\test2”),则程序不会执行批处理文件。

但如果我改为传递 E:\test folder\test2 批处理文件将被执行,但显然第二个参数的值 E:\test 只有.. 所以我想做的是使用 % 读取第一个参数1 并将其余内容放入另一个变量中。

有人可以告诉我如何实现这一目标吗?我尝试使用 %* ,但它给了我第一个和第二个参数。我想删除第一个以空格作为分隔符的标记,以便将其余内容保存在变量中。有没有办法做到这一点 ?

例如如果我通过 test.bat testparameter1 E:\test folder\test folder2\test folder3

我想将值 E:\test folder\test folder2\test folder3 读入一个变量。

如果我通过 test.bat testparameter1 E:\test\test folderX\test folderY 值我想读入批处理文件中的变量是 E:\test\test folderX\test folderY

有人可以帮我解决这个问题吗?提前致谢。

【问题讨论】:

  • 你能展示你完整的 CreateProcess 语句吗?我怀疑您的第二个论点周围的引号需要转义。

标签: command-line batch-file arguments space delimiter


【解决方案1】:

如果你的批处理文件被调用

test.bat testparam1 "E:\test\folder2\test folder 3"

您可以使用%1%2读取参数

rem Contents of test.bat
@echo %0
@echo %1
@echo %2

以上产生:

C:\Temp>test testparam1 "E:\test\folder2\test folder 3"
test.bat
testparam1
"E:\test\folder2\test folder 3"

C:\Temp>

所以您已经将参数作为变量;第一个被称为%1,第二个被称为%2,依此类推。

如果问题是您尝试使用“E:\test\folder2\test 文件夹 3”路径执行某项操作,请确保在传入之前添加尾部反斜杠:

"E:\test\folder2\test folder 3\"

【讨论】:

  • 谢谢肯,问题是如果我像你提到的那样直接用双引号从命令行传递参数,但是当我尝试使用 CreateProcess 方法从 C++ 代码运行批处理文件时,然后由于某种原因,如果我使用双引号传递参数,批处理文件不会被执行。它非常令人费解,我不知道为什么会这样。
  • 请在上面编辑您的问题以提供您正在使用的CreateProcess 代码。由于批处理文件工作正常,问题必须出在您将命令行传递给CreateProcess 的方式上。
【解决方案2】:

您能否通过 C++ 代码中的另一个字符更改路径中的空格?例如,如果我们通过 arroba 改变空格,那么你可以这样传递:

test.bat testparameter1 E:\test@folder\test@folder2\test@folder3

并在批处理文件中以这种方式进行相反的更改:

set param2=%2
set param2=%param2:@= %

另一种可能的方法是从第二个参数开始收集所有参数到同一个变量中,每个参数一个空格分开:

set param1=%1
shift
set param2=
:nextParam
set param2=%param2% %1
shift
if not "%1" == "" goto nextParam

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 2018-09-08
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多