我想在特定行号的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.
我错过了什么。请指导。
答案 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上有各种各样的问题。
tasklist /fi "pid eq 2060" /nh
中,引号是必需的。以下将处理反斜杠并保留空格,但不会处理双引号参数。这种方法易于使用。您可以使用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\" "