バックアップファイルに差分を追加したい

このQ&Aのポイント
  • 複数のディレクトリの中に特定のファイル(user.txt)があります。そのファイルには、会員番号と可変文字が入っており、会員の入会、退会があるため絶えず変動しています。これを過去の会員も含めデータの記録を残しておきたいと考えています。
  • フォルダには数百あり、一つ一つのフォルダに対して処理するのは時間がかかるため、一括処理できるスクリプトを探しています。
  • VBスクリプトを改造して、会員番号をサーチして無かったら追記するような指示にしたいです。具体的な改造方法を教えていただきたいです。
回答を見る
  • ベストアンサー

差分を抽出してバックアップファイルに追加したい

複数のディレクトリの中に特定のファイル(user.txt)があります。 そのファイルには、それぞれ a012345<>可変文字 a067890<>可変文字 a024680<>可変文字 のようなテキストベースの文字(左が会員番号)が入っており、このファイルは 会員の入会、退会があるため絶えず変動しています。 これを過去の会員も含めデータの記録を残しておきたいと考えています。 (下記参照。【folderA】の会員リスト(user.txt)をサーチし、退会会員を残したまま 新会員分だけ【A_backup】user.txtに追記バックアップしたい。 可変文字がありますので、行の一致では追加の可否を決めれません。 あくまで、会員ナンバーの一致の有無だけで判断、差分を追加バックアップする 形となります。 ************ イメージ ************ 12月23日 【folderA】/user.txt →     【A_backup】/user.txt a012345<>可変文字 a012345<>可変文字 a067890<>可変文字 a067890<>可変文字 a024680<>可変文字 a024680<>可変文字 12月24日(012345、067890退会、112233,445566入会) バックアップファイルには「退会ユーザーはそのまま、入会ユーザーだけ追記。」 【folderA】/user.txt →     【A_backup】/user.txt a024680<>可変文字 a012345<>可変文字 a112233<>可変文字 a067890<>可変文字 a445566<>可変文字 a024680<>可変文字      a112233<>可変文字      a445566<>可変文字 この【FolderA】のようなフォルダは数百あり、ひとつひとつやっていては 時間がかかるため、この作業を一気に処理してしまいたいです。 下記のVBスクリプトは、指定したフォルダの●●という文字を特定の文字に 変換するスクリプトです。膨大な数のフォルダに対し一括変換が可能です。 このスクリプトを改造して、「●●を探して変更する」という指示ではなく、 「会員番号をサーチして無かったら追記する」という指示にすれば私の望む スクリプトになりそうな気がしておりますが、その方法が分かりません。 どなたか改造方法をご教授頂けませんでしょうか? ******************************************************** 当方が保有するスクリプト '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ FileExt = "user.txt" '←名前を指定してください(半角小文字) myWORD1 = "●●●" '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Set myWSH = CreateObject("WScript.Shell") myDSKTOP = myWSH.SpecialFolders("Desktop") Set myWSH = Nothing myWKFLD = Replace(WScript.ScriptFullName, WScript.ScriptName, "") Set mySh = CreateObject("Shell.Application") Set myPath = mySh.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, myDSKTOP) If myPath Is Nothing Then WScript.Quit myFLD = myPath.Items.Item.Path Set mySh = Nothing : Set myPath = Nothing Set myFS = CreateObject("Scripting.FileSystemObject") For Each mySUBFLD In myFS.GetFolder(myFLD).SubFolders For Each myCSV In myFS.GetFolder(mySUBFLD).Files If LCase(myFS.GetFile(myCSV).Name) = FileExt Then myWORD2 = myWORD1 '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Select Case myFS.GetFolder(mySUBFLD).Name Case "folderA" : myWORD2 ="backup_A" Case "folderB" : myWORD2 ="backup_B" Case "folderC" : myWORD2 ="backup_C" End Select '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ If myWORD2 <> myWORD1 Then Set myRF = myFS.GetFile(myCSV).OpenAsTextStream(1) myTMP = myFS.GetTempName Set myWF = myFS.OpenTextFile(myWKFLD & "\" & myTMP, 8, True) myWF.WriteLine Replace(myRF.ReadAll, myWORD1, myWORD2) myRF.Close : myWF.Close myTIME = Year(Now) & "_" & Month(Now) & "_" & Day(Now) & "_" & Hour(Now) & "_" & Minute(Now) & "_" & Second(Now) 'myFS.GetFile(myCSV).Name = "元" & myTIME & myFS.GetFile(myCSV).Name myFS.GetFile(myCSV).Delete myFS.GetFile(myWKFLD & "\" & myTMP).Name = FileExt myFS.GetFile(myWKFLD & "\" & FileExt).Move mySUBFLD & "\" End If End If Next Next Set myRF = Nothing : Set myWF = Nothing : Set myFS = Nothing Msgbox "完了"

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

こんな個別の複雑な課題を回答者にやらせるの?丸投げもいいところではないか。 自分でやることが基本だが、自分で疑問点、問題点を絞ること。 ここは、コードを作る下請けのコーナーではないと思うよ。 自社のシステム関連の人にでも頼む課題だと思うよ。 それがいないし、自分で出来なければ、あきらめるか、金を出して業者にやってもらうこと。 この世に中はそういうのが基本です。米を自分で作れないから、お金を出して米屋で米を買うでしょう。 コンピュター関連だけはは例外とおもうのか? ーー またやりたいことがよくわからない。 >退会会員を残したまま新会員分だけ 新規会員、退会会員は、各レコードごとで、どういう風に判別するのか? >会員ナンバーの一致の有無だけで判断、、・・とはどういうこと? ーー >a012345<>可変文字 という表現の<>は何を意味するの。特殊な意味がある記号を使う理由は何? ーー 連休明けまで回答が付かなければ、質問表現を改めて再質問したら。 課題が違うスクリプトをここに挙げても意味無い場合が多いと思うよ。

tajix14
質問者

補足

ありがとうございました。 お金を払うことについては全然かまわないと考えているのですが、当方、趣味でやっているため有料で依頼出来る会社を持っておりません。 ここが唯一の頼りになる場所でした。このような依頼の仕方は初めてですが、 他に依頼方法がありませんでした。 おっしゃる通り、もう少し違った形で依頼させて頂きます。 ありがとうございました。

関連するQ&A

  • テキストファイルに一行文字を追加したい

    バッチ処理でテキストファイルの最後に文字列を追加する作業をやりたいのです。 普通の文字列ですと、1)のようにして上手くいきます。 ところが「"」の入った文字列を一行加えようと2)のようにすると、エラーになってしまいます。どうしたら前に進めるでしょうか? --------- 1)上手くいくケース ----------- Set fso = CreateObject("Scripting.FileSystemObject") Set tmpFile = fso.GetFile("C:\test\hoge.txt") Set f = tmpFile.OpenAsTextStream(8, -2) f.Write("一行追加しました") f.close Set f = Nothing Set tmpFile = Nothing Set fso = Nothing --------- 2)上手くいかないケース ----------- Set fso = CreateObject("Scripting.FileSystemObject") Set tmpFile = fso.GetFile("C:\test\hoge.txt") Set f = tmpFile.OpenAsTextStream(8, -2) f.Write("一行"追加"しました") f.close Set f = Nothing Set tmpFile = Nothing Set fso = Nothing

  • ファイルの作成日時について

    職場で簡単なファイルのバックアップPGをWSHで作っていますが ファイルの作成日時が思うように入ってくれません。 WSHの流れは下記にしたいと考えています。 (1)前回分のファイルを作成日時を末尾に付けてリネーム (2)WSHからバッチを呼び出して、ファイル作成 (2)でファイルが作成はされるのですが、(1)の処理でリネームした ファイルの作成日時(実行時間より古い時間)が入って作成されてしまい、(2)が実行された 日付が入ってくれません。 ちなみに、更新日時アクセス日時は(2)の実行時間が入ります。 環境は以下になります。 OS:Windows7Pro SP1 →この先WindowsSV 2008R2で実行させたいと考えています。 Windowの仕様なのか、どうなのか、わからないのですが どなたか何か回避策をご存じの方がみえれば、ご教授をお願いいたします。 テストで作成したWSHとBatのソースを下記に貼り付けます。 WSH *************************************** option explicit '変数定義 Dim objFso Dim objFile Dim objWShell 'オブジェクトの生成 Set objFso = Wscript.CreateObject("Scripting.FileSystemObject") Set objFile = objFso.GetFile("C:\testDir\File-A.txt") 'ファイル名変更 objFso.GetFile("C:\testDir\File-A.txt").Name = "File-B.txt" 'オブジェクト解放 Set objFile = Nothing 'bat実行 Set objWShell = CreateObject("WScript.Shell") objWShell.Run "C:\testDir\echo.bat", 0, True 'batで作成したFile-Aのオブジェクト生成 Set objFile = objFso.GetFile("C:\testDir\File-A.txt") 'オブジェクト解放 Set objWShell = Nothing Set objFile = Nothing Set objFso = Nothing WSH *************************************** Bat **************************************** echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA > C:\testDir\File-A.txt Bat **************************************** 以上、よろしくお願いします。  

  • 10分おきに自動でバックアップファイルを作成する

    エクセルファイルで 「10分おきに自動でバックアップファイルを作成する」 ということは可能ですか? Sub バックアップ作成() Dim myFSO As Object Dim MyFile As Object Dim WSH As Variant Dim strdate As String Set myFSO = CreateObject("Scripting.FileSystemObject") Set WSH = CreateObject("Wscript.Shell") strdate = Format(Now, "yyyy年mm月dd日hh時mm分") myFSO.CopyFile ActiveWorkbook.FullName, "D:\backup\" & strdate & ".xlsm" Set MyFile = Nothing Set myFSO = Nothing Set WSH = Nothing End Sub これでバックアップは作成できるのですが 「10おきに」というのはどうすればいいのでしょうか?

  • VBSで、テキストファイルに対して、全体の途中に文字列を追加したい

    こんばんわ VBSについて質問です。 テキストファイルを開いて、文字列を追加するスクリプトを作成したいのですが、 以下のようなプログラムであれば、行の一番下に文字を追加できると思います。 ########ここから Dim objFS,objText,objFile Set objFS = CreateObject("Scripting.FileSystemObject") Set objFile = objFS.GetFile("C:\test\vbs\test.txt") Set objText = objFile.OpenAsTextStream(8,-2) objText.WriteLine("新しい行") Set objFILE = Nothing Set objText = Nothing ############ここまで しかし今やりたいのは分の途中に文字をいれたい。 たとえばテキストファイルが A B C D というファイルだったら、 "B"を検索して、Bの下に”新しい行”という文字列を追加したいです。 いろいろ調べましたがどうもうまくいきません。 わかる方ご教授願います。

  • VBSバックアップ

    バックアップスクリプト(VBS)について教えて下さい。 単純にディレクトリをバックアップするスクリプトは、出来たのですが これに付加機能を与えたいです。 ◆世代管理をしたい。 ◆iniファイルから、バックアップ元と先、管理する世代等の情報を読み込みたい。 <bkup.vbs> Option Explicit Const ForReading = 1 '読み込み Const ForWriting = 2 '書きこみ(上書きモード) Const ForAppending = 8 '書きこみ(追記モード) Dim objFileSys Dim objShell Dim strCopyFrom Dim strCopyTo Dim strToDir Dim strNewDate WScript.echo "バックアップを開始します" Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") strNewDate = Year(Now) & _ Right(("0" & CStr(Month(Now)+0)),2) & _ Right(("0" & CStr(Day(Now)+0)),2) strCopyFrom = "C:\vbs" strToDir = "C:\backup" strCopyTo = objFileSys.BuildPath(strToDir,strNewDate) If objFileSys.FolderExists(strCopyTo) = True then WScript.echo "指定のパスには既にディレクトリが存在する為、" & _"バックアップ処理を中断します。" WScript.Quit Else objFileSys.CopyFolder strCopyFrom,strCopyTo WScript.echo "バックアップ処理は正常に完了しました。" End If Set objFileSys = Nothing Set objShell = Nothing 宜しくお願い致します。

  • 【VBScript】文字列変換&抽出

    VBScriptで以下の動作を実現させたいと思っています。 ・vbsファイルにテキストファイルをドラッグする ・InputBoxに任意の文字列を入力する ・変換しますか?と問われるため、 「はい」を押したらTextStreamオブジェクトを1行ごとに読み込む ・見つかった文字列を置換し、その文字列が含まれた全ての行を  別名のテキストファイルに抽出する  例:(ファイルA)    asdfghjk.vbs    1:あいうえお     2:かきくけこ 3:あいうえお ⇒ (ファイルB)    asdfghjk_20151217.vbs    1:をふうえお 2:をふうえお ・「いいえ」を押したら変換しないで別名のテキストファイルに 見つかった文字列が含む行をそのまま抽出する ・見つからなかった場合、何もしない (別名のテキストファイルを作成しない) 前のプログラムだと、文字列が見つからなかった場合でも 空のテキストファイルを作成していました。 これを防ぐために、以下のように修正したのですが、 オブジェクトが存在しない旨のエラーが出て機能してくれません。 どこが問題なのでしょうか? また、次のステップとして、変換処理を加えたいのですが、 InputBoxを再び使用せずに置換することは可能なのでしょうか? 恐れ入りますが、回答いただけますと幸いです。 Option Explicit Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objParm, strFile, strX, lonMsgBox Dim objFSO, objOpen, strText, strNewFile, objTS Dim lonDate, v, strBuffer Set objParm = Wscript.Arguments If objParm.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf objParm.Count >= 2 Then WScript.Echo "2つ以上のファイルが指定されています。" WScript.Quit Else strFile = objParm(0) End If Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then WScript.Echo objFSO.GetExtensionName(strFile) MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", vbExclamation, "Error" WScript.Quit End If strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) Then MsgBox ("キャンセルされました。") WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", vbOKOnly, "Error" WScript.Quit End If lonMsgBox = MsgBox(strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonMsgBox <> vbYes Then MsgBox ("変換をスキップします。") End If lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2) strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & _ lonDate & "." & objFSO.GetExtensionName(strFile)) Set objOpen = objFSO.OpenTextFile(strFile, ForReading) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine v = strText.ReadLine If InStr(v, strX, vbTextCompare) > 0 Then strBuffer = strBuffer & v & VBCrLf End If Loop objOpen.Close Set objOpen = Nothing If IsEmpty(strBuffer) Then MsgBox strX & "が見つかりませんでした。" WScript.Quit End If Set objTS = objFSO.OpenTextFile(strNewFile, ForWriting, True) objTS.WriteLine strBuffer objTS.Close Set objTS = Nothing Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。")

  • VBS 改行無しのファイル抽出方法

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ path = "a.txt" Set FSO = WScript.CreateObject( "Scripting.FileSystemObject" ) '全行読み込み処理 (改行を1行単位として) Set f = FSO.OpenTextFile( path ) Do Until f.AtEndOfStream line = f.ReadLine() i_line = f.Line - 1 Loop WScript.Echo "全件数= " & i_line '最終行-5読み込み処理 Set f = FSO.OpenTextFile( path ) For i=1 To i_line - 6 f.SkipLine Next LAST5 = f.ReadLine() MOJI = Mid(LAST5,20,5) WScript.Echo "文字 = " & MOJI コード------------------------------------------------------------------ 上記VBSの簡単な流れは・・・ (1)改行で1行とみなす a.txt を全行取得。 (2)全件数を表示 (3)最終行から5行前の行まで移動。 (4)(3)の行から20文字からの5文字を取得。 (5)5文字を表示。 とこんな感じです。 しかし、これだと改行有のファイルにのみ有効で 改行無には対応出来ません。 例えば120文字で1行とみなすファイルでも同様の 取得がしたいのです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

  • エクセルVBAで指定フォルダ内の選択ファイル名の取得

    お世話になります。 エクセルVBA昨日から始めた初心者です。 いま、 Private Sub CommandButton1_Click() Dim Shell, myPath Set Shell = CreateObject("Shell.Application") Set myPath = Shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "\\hk001a24\va\data\ツール") If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path Set Shell = Nothing Set myPath = Nothing End Sub というの作成したのですが、 これだとフォルダの選択しか出来ませんでした。 \\hk001a24\va\data\ツールの下にあるファイルを選択出来て、その選択したファイル名をVBA取得して保持できる ようにしたいのですが・・・ 急いでいるのでここで質問させて頂きました。 よろしくお願いします。

  • VBAで2変数の差分を取る方法  その2

    前回はありがとうございました。 まだ最終までは行ってないのですが、Wendyさんfumufumuさんに教えていただいたマクロともうまく動きます。 fumufumuさんの変数bufなんですが、この中身をシートに一行ずつ入れるにはどうするのでしょう。 Msgboxでは行ごとに綺麗に表示されす。 OpenAsTextStreamで開きReadAllで読み込んだbufの中身は配列になっているのでしょうか。 Splitで色々やってみたんですが、旨くいかいなです。 ---------------------------------------------------- Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(TXT).OpenAsTextStream .Skip size buf = .ReadAll .Close End With Set fso = Nothing MsgBox buf ------------------------------------------------------ fumufumuさんのDim fso As New FileSystemObjectでは動かなかったので Set fsoにするなど一部変えてあります。

  • vbsでバックアップデータファイルをlzh形式に自動圧縮したい

    毎日、システムのバックアップデータが、その日の日付をファイル名として作成されます。 このファイルを日々圧縮しているのですが、自動で出来たらと思います。 『教えて!goo』等で調べて何とか書いたのが下のソースです。 StrLzhName = "test.txt.lzh" StrFileName = "test.txt" Set shell = WScript.CreateObject("WScript.Shell") shell.CurrentDirectory = "c:\" Set wShell = CreateObject("WScript.Shell") Set oExec = wShell.Exec("lha32 a -d StrLzhName StrFileName") c:\直下に、lha32.exeと、test.txtを置いてあります。 wShell.Exec()で、変数StrLzhNameと、StrFileNameを直接、 test.txt.lzh、test.txtと指定すると、圧縮できます。 このような変数の使い方は間違っているのでしょうか?? 毎日ファイル名が変わるので、どうしても変数が使いたいのです。 アドバイスよろしくお願いいたします。

専門家に質問してみよう