【问题标题】:How to start an external program with a file from a C program when both paths have spaces?当两个路径都有空格时,如何使用 C 程序中的文件启动外部程序?
【发布时间】:2011-03-31 13:59:18
【问题描述】:

我正在尝试使用最终调用的 VS2005 修复现有的 C 程序

int system(command) //in C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\system.c)

带参数值

开始 C:\Program Files\VideoLAN\VLC\vlc.exe C:\Documents and Settings\me\My Documents\My Music\09 - Track09.mp3

要启动的程序和文件名路径都由获取的环境变量组成,命令 start 附加到 char 缓冲区的开头。环境变量是:

  • %VLCPATH%,其值为C:\Program Files\VideoLAN\VLC

  • %MUSIC%,其值为C:\Documents and Settings\me\My Documents\My Music

我一直在用 XP 命令提示符尝试这个,当路径没有空格时一切正常。这也有效:

"%VLCPATH%\vlc.exe" "%MUSIC%\09 - Track09.mp3"

那我该怎么办?

  1. 编辑环境变量以包含引号? (不要这么认为)
  2. 检查命令是否有文件作为参数,然后以某种方式为它们添加带有转义字符的引号并删除单词 start?
  3. 做一些我不知道的明智/优雅的事情

【问题讨论】:

  • 你能用execv()代替system()吗? Windows 上的棘手部分是 fork() 等效项。但是避免使用“shell”(cmd.exe)可能是最好的方法。
  • 作为一般规则,您应该始终引用命令。引用可执行文件本身和任何作为路径的参数。
  • @jonathan:很抱歉,我没有完全理解。我必须找出这个 execv ... @Luke:所以我应该删除开头并使用一些转义字符操作“字符串”,以便它包含引号?
  • 查看CreateProcess。您可能仍需要引号。
  • 感谢两位的快速回复!

标签: c command-line command-line-arguments command-prompt


【解决方案1】:

我会尝试引用所有参数,例如:

int main(int argc, char *argv[])
{
  char command[1024];
  char *title = "test vlc";
  char *executable = "vlc.exe";
  char *param = "09 - Track09.mp3";

  snprintf(command, sizeof(command), "start \"%s\" \"%s\" \"%s\"",
           title, executable, param);
  printf("%s\n", command);
  system(command);

  return EXIT_SUCCESS;
}

显然用您确定的可执行文件和参数替换可执行文件和参数。

【讨论】:

  • 这在 XP 命令提示符下不起作用:它从 09 - Track09.mp3 开始,默认程序是媒体播放器。它忽略了启动的第一个参数(vlc 程序)。
  • 抱歉,我必须做一些更改才能尝试此代码。但命令提示符不接受
     start "C:\Program Files\VideoLAN\VLC\vlc.exe" "C:\Documents and Settings\me\My Documents\My Music\09 - Track09.mp3" 
  • @matti,“start”命令的第一个参数是窗口标题,而不是可执行文件。我已经更新了我的解决方案,请尝试一下,如果它有效,请告诉我。
【解决方案2】:

在 Windows 中,启动的程序路径和任何带有路径名的参数如果包含空格,都需要用双引号括起来(“like this”)。

例如:

"C:\Program Files\VideoLAN\VLC\vlc.exe" "C:\Documents and Settings\me\My Documents\My Music\09 - Track09.mp3"

【讨论】:

  • 谢谢。但是开始呢?这可以在“字符串”的开头开始吗??
  • 这在 XP 命令提示符下不起作用:它从 09 - Track09.mp3 开始,默认程序是媒体播放器。它忽略了启动的第一个参数(vlc 程序)。
  • 抱歉,删除了“开始”。引号中的第二部分(文件参数)现在将作为单个命令行参数传递给 vlc.exe。
  • 感谢您的努力,但正如我在问题中所说,我知道这是可行的。问之前我试过了...
猜你喜欢
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2017-08-15
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多