在Lua中将命令行参数作为字符串传递
我正在尝试从Lua脚本执行 当我将文本作为参数传递时,它可以正常工作在Lua中将命令行参数作为字符串传递,lua,Lua,我正在尝试从Lua脚本执行 当我将文本作为参数传递时,它可以正常工作 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.wa
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失败格式:无法打开输入文件“filename”:没有此类文件或目录
因此,我的问题是如何正确地将字符串作为命令参数传递?在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
的第二个参数是要插入数组中的条目之间的字符串。因此,每个数组元素之间将有一个空格;我们不需要手动添加它们。在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”]..filename2..[”“])
如果您的文件名可以包含空格,则需要更多的引号:os.execute([[“C:\Sox\Sox.exe”-S”]..filename..[“-r 22050”]..filename2..[”“]])
使用表是一个我不知道的很好的解决方案,谢谢。但是你的第一个建议对我不起作用。当我执行操作系统时,[[C:\Sox\Sox.exe“-S]]。。文件名。。[[-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
的参数周围加括号。你在有效的版本中加了括号。使用一个表是一个我不知道的很好的解决方案,谢谢。但是你的第一个建议对我不起作用。当我做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的参数周围加上括号。你在第一个版本中就做了。