1

フォルダー内に 10000 個以上のファイルがあります (拡張子 *.WIR - 内部はプレーン テキストです)。すべての行の中の特定の行を見つけて置き換えたい。私の問題は、この行がすべてのファイルでわずかに異なることです + スクリプトを強制的にバッチ処理する方法がわかりません。

サンプル ファイル 1 には、「INSULATION RESIS 20.0 M オーム」があります。

サンプル ファイル 2 には、「INSULATION RESIS 100.0 M オーム」があります。

サンプルファイル 3 には、「INSULATION RESIS 0.2 M ohm」...

それらをすべて「INSULATION RESIS 500.0 M ohm」に変更する必要があります。

VBS スクリプトでワイルドカードを使用して、すべてを同時にバッチ処理できる可能性はありますか。どうやってやるの?

ご回答ありがとうございます。

4

2 に答える 2

2

私はおそらく次のようなことをするでしょう:

Set fso = CreateObject("Scripting.FileSystemObject")

Set re = New RegExp
re.Pattern = "(INSULATION RESIS) \d+\.\d+ (M ohm)"

For Each f In fso.GetFolder("...").Files
  If LCase(fso.GetExtensionName(f)) = "wir" Then
    filename = f.Path
    tempname = filename & ".tmp"

    Set f_in = fso.OpenTextFile(filename)
    Set f_out = fso.OpenTextFile(tempname, 2)
    Do Until f_in.AtEndOfStream
      f_out.WriteLine re.Replace(f_in.ReadLine, "$1 500.0 $2")
    Loop
    f_in.Close
    f_out.Close

    f.Delete
    fso.MoveFile tempname, filename
  End If
Next

このソリューションでは、各ファイルを 1 行ずつ処理することで、大きな入力ファイルによるメモリ不足の可能性を回避します。このソリューションの欠点は、出力処理に追加の手順が必要になることです (出力を一時ファイルに書き込み、入力ファイルを一時ファイルに置き換えます)。

于 2013-04-04T09:47:26.093 に答える
2

3 つの (サブ) 問題に対する 3 つの戦略:

cscript 01.vbs
xxA 1.0 BxxA 1.1 BxxA 123.456 Bxx
xxA 500.0 BxxA 500.0 BxxA 500.0 Bxx
Option Explicit

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")

' use RegExp to replace all occurrences of "A #.# B" in a string
Dim reRpl : Set reRpl = New RegExp
Dim sTest : sTest     = "xxA 1.0 BxxA 1.1 BxxA 123.456 Bxx"
reRpl.Global = True
reRpl.Pattern = "(A )\d+\.\d+( B)"
WScript.Echo sTest
WScript.Echo reRpl.Replace(sTest, "$1500.0$2")

' use FileSystemObject/Stream to read/write from/to file
Dim sAll : sAll = oFS.OpenTextFile(WScript.ScriptFullName).ReadAll()
WScript.Echo sAll
oFS.CreateTextFile(WScript.ScriptFullName, True).Write sAll

' use FileSystemObject/Folder/File to loop directory
Dim oFile
For Each oFile In oFS.GetFolder(".").Files
    WScript.Echo oFile.Name
Next

username24.txt
01.vbs
00.vbs
于 2013-04-04T08:57:23.573 に答える