我正在使用TCL / Tk中的文件浏览器,我想添加一些东西来执行当前选择的命令(使用%l%f)%l执行完整列表和%f执行命令与每个文件。 我唯一的问题是,如果我键入一个像“gedit”这样的命令,例如它可以工作但是只要我输入带参数的命令它就不起作用...... 我一直在寻找,我不明白...... 如果有人能帮助我...... btw getl var Name是一个函数,它在完整路径(/ home / ...)中返回一个FileName,如果我返回应该执行的字符串并将其放在终端中,它就可以工作......
以下是代码:
proc tl_exec {liste command } {
#lorsqu'il faut effectué la commande avec la liste en param
if { [string first "%l" $command] > 0} {
foreach v $liste {
lappend args [getl $v Name]
}
set com [string map [list "%l" [join $args " "] ] $command ]
puts $com
set val [exec [split $com " "] ]
} elseif { [string first "%f" $command] > 0} {
#lorsqu'il faut effectué la commande pour chaque fichier
foreach v $liste {
set com [string map list ["%f" [getl $v "Name"] ] $command ]
lappend val [ exec [split $com " "] ]
}
} else {
#lorsqu'on a pas de fichiers
set val [exec $command]
}
}
非常感谢
答案 0 :(得分:4)
您的代码有多个问题,它可能会破坏文件名中的特殊字符或空格,因为您根本没有引用。
但你认为将一切都视为一个单一的命令是正确的。
set val [exec [split $com " "] ]
没有达到预期效果,split会返回一个列表,但不会自动将该列表转换为exec的额外args。
如果您使用Tcl 8.5,您可以尝试:
set val [exec {*}[split $com " "] ]
将列表转换为单个参数以传递给exec。
但是你使用的代码一般都很脆弱,因为你没有处理写入stderr的任何退出代码或程序,所以需要一个更复杂的解决方案来保持健壮。
请查看http://wiki.tcl.tk/1039,尤其是页面底部的讨论。