c++ 运行 system() 在后台,目录路径中有空格,+输出到文本文件
c++ run system() in background, with spaces in dir path, + output to text file
我正在尝试 运行 带有一堆选项的 tshark exe 并输出到 fil(见下文)。然而,我真的坚持使用 system() 命令的正确语法。
我以前在这里得到过帮助,从那以后我什至让它可以使用 dos for 循环,但这超出了我的范围。根据我在 SO 上看到的其他建议,我尝试了各种转义序列并将整个命令封装在 2-3 个引号中。
命令是:
C:\Program Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\output.csv
我试过:
system("start C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &");
system("\"start C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info\" > c:\test\tshark2.csv &");
...等等。
如果不是因为目录中的 space,我认为我可以通过这个。将目录更改为 运行 tshark 是否更容易?另外,我到目前为止的建议是在系统调用中使用“start”,如果这是错误的,请随时指出。
对这些问题表示歉意,但我最近才接触 C++,但我仍在适应某些事情...
我应该补充一点,我也在尝试将其作为后台作业发送到 运行,以便我的脚本的其余部分在 运行 时继续。
您不需要在系统函数调用中启动。只需提供类似 system(C:\Program\ Files\Wireshark\tshark.exe ...后跟参数);
就这样做:
系统("start ,\”C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv\" &");
正确的字符串是:
"start \"\" \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &"
(根据this Q/A.
,您需要将空引号字符串 (""
) 作为第一个参数
或者,没有 start
命令:
"\"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &"
你只在 "
中包装包含空格的路径(在 c++ => \"
中被 \
转义),空格不是,不能也不需要被转义.
system("start \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &");
每个人的回答几乎正确。试试这个:
system("\"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv");
在你的问题中,行尾有一个“&”。这在 Linux 和其他 *nix 系统上用于 运行 后台作业。在 Windows 上,'&' 是一个命令分隔符(允许您将多个命令放在同一行)。要在后台运行,需要使用start
命令。但是,如果启动命令的第一个参数用引号引起来,start
命令会认为它是 window 标题。然后真正的命令成为第二个参数。所以你应该在实际参数之前在引号中添加一个虚拟参数:
system("start \"\" cmd /c \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info ^> c:\test\tshark2.csv");
另请注意,重定向运算符 >
需要转义为 ^>
,这样就不会重定向 start
命令的输出(这没什么),而是重定向输出tshark 命令。 >
需要由 cmd.exe
解释,因此 start
的参数必须是 cmd
.
仅当您要在后台 运行 的程序是控制台应用程序时才需要 start
命令(即通常 运行 在命令提示符 window).如果它是一个普通的 Windows 应用程序,那么它将 运行 与启动它的应用程序并发,因此不需要使用 start
.
我正在尝试 运行 带有一堆选项的 tshark exe 并输出到 fil(见下文)。然而,我真的坚持使用 system() 命令的正确语法。
我以前在这里得到过帮助,从那以后我什至让它可以使用 dos for 循环,但这超出了我的范围。根据我在 SO 上看到的其他建议,我尝试了各种转义序列并将整个命令封装在 2-3 个引号中。
命令是:
C:\Program Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\output.csv
我试过:
system("start C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &");
system("\"start C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info\" > c:\test\tshark2.csv &");
...等等。
如果不是因为目录中的 space,我认为我可以通过这个。将目录更改为 运行 tshark 是否更容易?另外,我到目前为止的建议是在系统调用中使用“start”,如果这是错误的,请随时指出。
对这些问题表示歉意,但我最近才接触 C++,但我仍在适应某些事情...
我应该补充一点,我也在尝试将其作为后台作业发送到 运行,以便我的脚本的其余部分在 运行 时继续。
您不需要在系统函数调用中启动。只需提供类似 system(C:\Program\ Files\Wireshark\tshark.exe ...后跟参数);
就这样做:
系统("start ,\”C:\Program\ Files\Wireshark\tshark.exe -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv\" &");
正确的字符串是:
"start \"\" \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &"
(根据this Q/A.
,您需要将空引号字符串 (""
) 作为第一个参数
或者,没有 start
命令:
"\"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &"
你只在 "
中包装包含空格的路径(在 c++ => \"
中被 \
转义),空格不是,不能也不需要被转义.
system("start \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv &");
每个人的回答几乎正确。试试这个:
system("\"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info > c:\test\tshark2.csv");
在你的问题中,行尾有一个“&”。这在 Linux 和其他 *nix 系统上用于 运行 后台作业。在 Windows 上,'&' 是一个命令分隔符(允许您将多个命令放在同一行)。要在后台运行,需要使用start
命令。但是,如果启动命令的第一个参数用引号引起来,start
命令会认为它是 window 标题。然后真正的命令成为第二个参数。所以你应该在实际参数之前在引号中添加一个虚拟参数:
system("start \"\" cmd /c \"C:\Program Files\Wireshark\tshark.exe\" -a duration:130 -i 3 -T fields -e frame.number -e frame.time -e _ws.col.Info ^> c:\test\tshark2.csv");
另请注意,重定向运算符 >
需要转义为 ^>
,这样就不会重定向 start
命令的输出(这没什么),而是重定向输出tshark 命令。 >
需要由 cmd.exe
解释,因此 start
的参数必须是 cmd
.
仅当您要在后台 运行 的程序是控制台应用程序时才需要 start
命令(即通常 运行 在命令提示符 window).如果它是一个普通的 Windows 应用程序,那么它将 运行 与启动它的应用程序并发,因此不需要使用 start
.