为什么文件名没有正确呈现

Why filename is not getting rendered properly

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

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 会做 backslash substitution 并且这些替换只会用双引号引起来。如果您需要文字反斜杠,则必须将其转义。当用大括号括起来时,这些替换将不会发生。

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

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

set filename {C:\tools\tcl\bin\my.log}

关于命令行参数的东西,不用费心了。 Tcl 会处理的。它将按原样从您的终端接收。

But this prints :

The log file C: ools cinmy.log

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

您的选择:

  • 转义单个反斜杠:"\t" 变为 "\t"
  • 使用大括号,防止反斜杠替换发生:"\t" 变为 {\t}
  • 使用Tcl的[file]命令assemble文件路径:

    file nativename [file join C:/ tools tcl bin my.log]

后一个选项是首选。