0

次の操作を実行する必要があります..

  1. ある場所から別の場所にファイルをコピーする

  2. 指定されたファイル内の単語を検索する

  3. ファイルポインタをその行の先頭に移動します

  4. 他のファイルからコピーされたデータをその場所に配置します...

3つのファイルは次のとおりです。

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

C:\Sanity_Automation\Route\*.tcl

C:\Script.tcl 

まず、Program Files の 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 に答える