Command line tcl exec打开带有图形的程序

Command line tcl exec打开带有图形的程序,command-line,tcl,exec,Command Line,Tcl,Exec,我想在记事本++中打开一个特定行号的文本文件。如果在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\t

我想在记事本++中打开一个特定行号的文本文件。如果在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.
我错过了什么。请指导。

类似于:

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

我还使用了正斜杠而不是反斜杠,因为您将获得一级替换并获得
F:Path est.txt


编辑:如果使用大括号防止替换,我想你可以保留反斜杠:

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

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

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

我还没有找到一个完美的解决方案。我所有的高管似乎都不一样。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\" "

我添加了一个习惯的陷阱。。。省略“开始”之后,它就可以工作了。我在我的应用程序中使用它,它是正常的(Tcl8.5@Windows7 64位)。并非所有windows程序或为windows编写的程序都会在参数中接受/。@BradLanam OK。。。你知道如果一个人有一个特定的路径,比如OP中的路径,那么该怎么办,这样无论程序是什么,这个参数都会在windows中被接受?就像你的参考问题一样,使用
[file nativename“F:/path/test.txt”]
应该可以很好地工作。你的回答很好。@BradLanam啊,谢谢。嗯,这意味着我们也可以通过
[file nativename{F:\Path\test.txt}]
来代替,如果初始路径由于某种原因被键入反斜杠;这就是它现在所做的,因为MacOS9不再是一个问题。(经典的Mac文件名…不同…)
set cmd "\"C:\\Program Files\\mystuff\\my stuff.exe\" "