【问题标题】:Pass command line arguments as string in Lua在 Lua 中将命令行参数作为字符串传递
【发布时间】:2017-04-26 19:40:01
【问题描述】:

我正在尝试从 Lua 脚本执行 Sox

当我将文字作为参数传递时,它工作正常。

os.execute('"C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav')

os.execute [["C:\\Sox\\sox.exe" -S C:\\SoX\\test.wav -r 22050 C:\\Sox\\SoX_out.wav]]

但是,当我尝试这样做时,我想做什么(例如):

filename = "C:\\SoX\\test.wav"
os.execute('"C:\\Sox\\sox.exe" -S filename -r 22050 C:\\Sox\\SoX_out.wav')

我明白了:

C:\Sox\sox.exe FAIL 格式:无法打开输入文件 `filename':没有这样的文件或目录

所以我的问题是如何正确传递一个字符串作为命令参数?

【问题讨论】:

  • 如果您的文件名可以包含空格,则需要更多引号:os.execute([[""C:\Sox\sox.exe" -S "]]..filename..[[" -r 22050 "]]..filename2..[[""]])

标签: lua


【解决方案1】:

在 Lua 中,字符串字面量完全是并且只有那个字符串。字符串对变量、全局环境、局部变量等一无所知。它们只是字符串。 Lua 中的字符串 "filename" 将始终是 8 个字符的字符串。它不会出去尝试找到一个名为filename的变量并从中提取一些东西。

你想要的是从多个字符串中构建一个字符串。字符串的一部分来自文字,一部分来自变量。 Lua 有几个工具可以做到这一点。最简单的是.. 连接运算符:

[["C:\Sox\sox.exe" -S ]] .. filename .. [[ -r 22050 C:\Sox\SoX_out.wav]]

这会从一个字符串文字、filename 变量的内容和另一个字符串文字构建一个新字符串。您在第一个字面量的末尾和第二个字面量的开头看到的空格是必需的,因为 Lua 不会在两个连接的部分之间插入空格。

对于更复杂的情况,只构建一个参数表并使用table.concat 从中构建一个字符串很有用:

local params =
{
  [[C:\Sox\sox.exe]],
  "-S",
  filename,
  "-r 22050",
  [[C:\Sox\SoX_out.wav]]
}

os.execute(table.concat(params, " "))

请注意字符串文字中缺少空格。这是因为table.concat 的第二个参数是一个要插入 数组条目之间的字符串。所以每个数组元素之间会有一个空格;我们不需要手动添加它们。

【讨论】:

  • 使用表格是一个很好的解决方案,我不知道,谢谢。但是你的第一个建议对我不起作用。当我执行os.execute[["C:\Sox\sox.exe" -S ]] .. filename .. [[ -r 22050 C:\Sox\SoX_out.wav]] 时,我得到“'..' 附近出现意外符号,为什么?这个版本工作正常:os.execute('"C:\\Sox\\sox.exe" -S ' .. filename .. ' -r 22050 C:\\Sox\\SoX_out.wav')
  • @nofish:它不起作用,因为您没有在第一个参数中为os.execute 加上括号。你在有效的版本中做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2020-03-09
  • 2016-09-08
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多