c ++在后台运行system(),在dir路径中有空格,+输出到文本文件

时间:2015-11-24 19:12:32

标签: c++ windows command-prompt io-redirection

我试图用一堆选项运行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 &");

......等等。

如果它不是dir中的空间我可以通过这个我认为。是否更容易更改为运行tshark的目录?此外,我到目前为止的建议是使用" start"在系统调用中,如果这是错误的,请随意说。

对问题表示歉意,但我最近才进入C ++,而且我还习惯了某些事情......

修改

我应该补充一点,我还试图让它作为后台工作运行,并且我的脚本的其余部分在运行时继续......

更新 - 解决方案

到达与以下答案相同的解决方案。根据在后台运行任务的原始要求,以下命令允许我执行此操作以及输出到文本文件:

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/output.csv");

5 个答案:

答案 0 :(得分:1)

正确的字符串是:

"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 &"

您只需在"中包含空格的路径(在{+ 1}}中以\转义),空格不是,不能也不需要转义。

答案 1 :(得分:1)

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 &");

答案 2 :(得分:1)

每个人的回答都几乎正确。试试这个:

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命令的第一个参数用引号括起来,start命令会将其视为窗口标题。然后真正的命令成为第二个参数。所以你应该在实际的参数之前在引号中添加一个伪参数:

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命令。如果它是一个普通的Windows应用程序,那么它将与启动它的应用程序同时运行,因此不需要使用start

答案 3 :(得分:0)

您无需在系统函数调用内部启动。只需提供类似系统的东西(C:\ Program \ Files \ Wireshark \ tshark.exe ......后跟参数);

答案 4 :(得分:0)

就这样做:

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 \"&");