Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Lua中将命令行参数作为字符串传递_Lua - Fatal编程技术网

在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

我正在尝试从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.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的参数周围加上括号。你在第一个版本中就做了。