在 Lua 中将命令行参数作为字符串传递

我正在尝试从 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 formats: can't open input file `filename': No such file or directory

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

点赞
用户734069
用户734069

在 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 的第二个参数是插入在数组元素之间的字符串。所以在每个数组元素之间都会插入一个空格,我们不需要手动添加。

2017-04-26 19:56:34