0

我必须执行以下操作..

  1. 将文件从一个位置复制到另一个位置

  2. 在给定文件中搜索单词

  3. 并将文件指针移动到该行的开头

  4. 将数据放在从其他文件复制的位置...

3个文件如下:

C:\program Files(X86)\Route\*.tcl 

C:\Sanity_Automation\Route\*.tcl

C:\Script.tcl 

首先,我需要将程序文件中的 Route 文件夹中的文件复制到 Sanity_Automation\Route*.tcl

然后我需要搜索“CloseAllOutputFile 关键字

C:/Sanity_Automation/Route/SystemTest.tcl

找到后,将光标移动到找到“CloseAllOutputFile”关键字的那一行的开头。

并将在 script.tcl 上找到的数据放置到该位置。

4

2 回答 2

2

首先,第一个“文件”实际上是一个模式。我们需要将其扩展为真实文件名列表。我们使用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
    }
}

通常,我会将修改作为副本的一部分进行,但我们会在这里按照您的方式进行。

于 2013-05-14T20:21:54.783 回答
0

尝试这个:

set sourceDir [file join / Files(x86) Route]
set destinationDir [file join / Sanity_Automation Route]

# Read the script to be inserted

set insertFnm [file join / Script.tcl]
set fil [open $insertFnm]
set insertData [read $fil]
close $fil

# Loop around all the Tcl scripts in the source directory

foreach inFnm [glob [file join $sourceDir *.tcl]] {
    # Determine the name of the output file

    set scriptName [file tail $inFnm]
    set outFnm [file join $destinationDir $scriptName]

    # Open source and destination files, for input and output respectively

    set inFil [open $inFnm]
    set outFil [open $outFnm w]

    while {![eof $inFil]} {
    set line [gets $inFil]
    if {[string match *CloseAllOutputFile* $line]} {
        puts $outFil $insertData
        puts $outFil "";         # Ensure there's a newline at the end
                                     # of the insertion
    }
    puts $outFil $line
    }

    # Close input and output files

    close $inFil
    close $outFil
}

它似乎对我有用。

于 2013-05-14T12:14:54.767 回答