tcl exec打开带参数的程序

时间:2014-12-24 06:10:37

标签: command-line tcl exec

我想在特定行号的notepad ++中打开一个文本文件。如果我在cmdline中执行此操作,则命令应为:

start notepad++ "F:\Path\test.txt" -n100

它从命令行运行良好。现在我必须从tcl做到这一点。但是我无法使用 exec 来使用此命令。当我尝试执行此操作时:

exec "start notepad++ \"F:\Path\test.txt\" -n100"

我收到此错误:

couldn't execute "start notepad++ "F:\Path\test.txt" -n100": no such file or directory.

我错过了什么。请指导。

3 个答案:

答案 0 :(得分:2)

this question类似:

exec {*}[auto_execok start] notepad++ F:/Path/test.txt -n10

首先,您需要将命令的每个参数作为单独的值提供,而不是单个字符串/列表。接下来,要模仿start命令,您需要使用{*}[auto_execok start]

我也使用正斜杠而不是反斜杠,因为你会获得第一级替换并获得F:Path est.txt


编辑:如果您使用大括号来防止替换,那么您可以保留反斜杠:

exec {*}[auto_execok start] notepad++ {F:\Path\test.txt} -n10

答案 1 :(得分:0)

您可以简单地用花括号括起整个exec语句。像这样:

catch {exec start notepad++.exe f:\Path\test.txt -n10}

答案 2 :(得分:0)

我还没有找到完美的解决方案。我所有的高管似乎都彼此不同。在Windows上有各种各样的问题。

  • 保留文件名(或其他)参数的双引号。
    • e.g。在tasklist /fi "pid eq 2060" /nh中,引号是必需的。
  • 保留文件名参数中的空格。
  • 保留文件名参数中的反斜杠字符。 [在内部,Windows不关心路径名是否具有/或\,但是某些程序将解析文件名参数并期望反斜杠字符]。

以下将处理反斜杠并保留空格,但不会处理双引号参数。这种方法易于使用。您可以使用list和lappend构建命令行。

set cmd [list notepad]
set fn "C:\\test 1.txt"
lappend cmd $fn
exec {*}$cmd

使用字符串变量而不是列表可以保留引用的参数:

set cmd [auto_execok start]
append cmd " notepad"
append cmd " \"C:\\test 1.txt\""
exec {*}$cmd

请注意,如果您需要提供要执行的命令的完整路径,则通常还需要引用路径名中的空格:

set cmd "\"C:\\Program Files\\mystuff\\my stuff.exe\" "