Tcl 为什么文件名不能正确呈现

Tcl 为什么文件名不能正确呈现,tcl,Tcl,我需要将程序的输出重定向到一个文件,下面是我用来创建输出日志文件名的代码: set filename "C:\tools\tcl\bin\my.log" puts "The log file $filename" 但这表明: The log file C: ools cinmy.log 注意:我还可以接收文件名作为脚本的参数: set logfile [lindex $argv 1] 当将日志文件作为arg和常量接收时,如何解决这两种情况下的问题?Tcl将这样做,并且这些替换将仅使

我需要将程序的输出重定向到一个文件,下面是我用来创建输出日志文件名的代码:

set filename "C:\tools\tcl\bin\my.log"
puts "The log file $filename"
但这表明:

 The log file C: ools    cinmy.log
注意:我还可以接收文件名作为脚本的参数:

set logfile [lindex $argv 1]
当将日志文件作为arg和常量接收时,如何解决这两种情况下的问题?

Tcl将这样做,并且这些替换将仅使用双引号进行。如果你需要一个反斜杠,你必须避开它。如果用大括号括起来,这些替换将不会发生

因此,您可以将变量定义为

set filename "C:\\tools\\tcl\\bin\\my.log"

关于命令行参数的东西,不用麻烦了。Tcl会处理好的。它将被接收,因为它是从您的终端

但这表明:

 The log file C: ools    cinmy.log
日志文件C:ools cinmy.log

这是因为双引号之间的文字字符串要进行反斜杠替换。例如,\t被解释为制表符控件字符,而不是带有分隔符的文件路径元素

您的选择:

转义单个反斜杠:\t变为\\t 使用大括号,防止反斜杠替换:\t变为{\t} 使用Tcl命令组合文件路径:

文件nativename[文件连接C:/tools tcl bin my.log]


后者是首选选项。

谢谢,但我有一个场景,我必须使用命令行中提供的文件名,比如set filename{$argv[1]}——我的意思是,当{}是一个文件名时,如何使用其中的变量。这些值不仅可以从命令行参数接收,还可以从为读取config而打开的INI文件接收。如果只是读取文件的内容并将其赋给变量,那么这些转义序列将不会影响代码。这仅在您在代码中定义变量时适用。好的,我认为使用puts打印配置变量的问题-可能发生了替换-如何转义打印一个名为“\”但不是常量的变量?谢谢-但是如果我们通过读取配置/INI文件来接收值?如果它的值是c:\tools\tcl\…我们如何设置它呢?正如Dinesh所写,tcl将保留从命令行[lindex$args 1]或配置文件获得的文件路径。在这种情况下,您不必担心反斜杠替换。好的,我认为使用puts打印配置变量的问题-可能是发生了替换-如何转义打印一个作为“\”但不是常量的变量?不,puts不会触发反斜杠替换。自己注意:设置x{\t};卖出x美元;卖出[subst$x]。请求替换时需要该命令。我怀疑您从配置文件获取文件路径的方式导致了急切的替换。您必须显示代码。我正在尝试这种方法-设置f C:\tools\tcl\bin\my.log;卖出$f;