首先,第一个“文件”实际上是一个模式。我们需要将其扩展为真实文件名列表。我们使用glob
.
# In braces because there are backslashes
set pattern {C:\Program Files(X86)\Route\*.tcl}
# De-fang the backslashes
set pattern [file normalize $pattern]
# Expand
set sourceFilenames [glob $pattern]
然后我们要复制它们。我们可以这样做:
set target {C:\Sanity_Automation\Route\}
file copy {*}$sourceFilenames [file normalize $target]
但实际上我们还想建立一个移动文件列表,以便我们可以在下一步中处理它们。所以我们这样做:
set target {C:\Sanity_Automation\Route\}
foreach f $sourceFilenames {
set t [file join $target [file tail $f]]
file copy $f $t
lappend targetFilenames $t
}
好的,现在我们要进行插入处理。让我们从获取要插入的数据开始:
set f [open {C:\Script.tcl}]
set insertData [read $f]
close $f
现在,我们要检查每个文件,将它们读入,找到插入的位置,如果我们找到位置,则实际插入,然后将文件写回。(您通过读取/修改内存/写入进行文本编辑,而不是尝试直接修改文件。总是。)
# Iterating over the filenames
foreach t $targetFilenames {
# Read in
set f [open $t]
set contents [read $f]
close $f
# Do the search (this is the easiest way!)
if {[regexp -indices -line {^.*CloseAllOutputFile} $contents where]} {
# Found it, so do the insert
set idx [lindex $where 0]
set before [string range $contents 0 [expr {$idx-1}]]
set after [string range $contents $idx end]
set contents $before$insertData$after
# We did the insert, so write back out
set f [open $t "w"]
puts -nonewline $f $contents
close $f
}
}
通常,我会将修改作为副本的一部分进行,但我们会在这里按照您的方式进行。