WSH文字置換ツールのエラー処理について

このQ&Aのポイント
  • Windows2003server上で動作する文字列置換ツールのエラー処理について困っています。
  • Readエラー時にスクリプトエラーが発生し落ちてしまうため、解決策を探しています。
  • 無効なフォルダ名や空白、存在しないファイル名を処理しない方法や、バッチの作り方についてのアドバイスをお待ちしています。
回答を見る
  • ベストアンサー

WSHの文字置換ツールについて(エラー処理)

Windows2003server上で動く、文字列置換ツールを用意したいと思ってます。 ※同様の質問をもう一件あげていますが、質問の根本が違うのであえて分けています。 よろしければそちらもご覧頂ければと思います。 今、考えている動作をしてくれるサンプルプログラムが@ITにあったので これを流用しようと思うのですがエラー処理が考慮されていないので Readエラー時にスクリプトエラーが発生し落ちてしまうので困っています。 置換サンプルプログラム http://www.atmarkit.co.jp/fwin2k/win2ktips/308strrpl/strrpl.html サンプルPG名 replace.wsf 想定している使い方は以下の通りです。 ・バッチでdir /Bの実行結果を、変換対象ファイル名として利用する。 ・バッチからFOR文でreplace.wsfを呼び出し、引数に変換対象ファイル名を入れる。 ・対象ファイル数分繰り返す 文字列置換の動作自体はサンプルPGの動作が希望通りで問題ありません。 ただ、上記のバッチ運用の場合フォルダ名や空白が引数に代入され スクリプトエラーとなってしまい処理が止まってしまいます。 解決策として、以下の2パターンがあると思います ・フォルダや空白、存在しないファイル名が代入された場合は無視する →On Error Resume Nextを記述しましたが、構文が誤っているようでエラーとなりました。 Readエラーを無視するにはどうすればいいのでしょうか。 ・バッチの作りを工夫し、存在するファイルしか代入されないようにする。 →考えましたが、方法が分かりませんでした。 解決策が分かる方、よろしくお願いします。

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

  • ベストアンサー
  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.2

@ITのサンプルプログラムは置換する複数ファイルをドラッグ&ドロップで受け入れるため、存在しないファイル名などのエラー処理は省かれています。 一つアドバイスを申し上げますと、スクリプトは手軽にエディタで内容を書き換えて実行できることが利点ですから、とにかく当面の目的を果たしたいのでしたら、サンプルプログラムのまま、ドラッグ&ドロップを複数回繰り返すのも手だと思います。別質問の置換文字列の外出しもせずに、ハードコーディングした複数のスクリプトを作って使えばよいのでは。 時間をかけて勉強して汎用的なスクリプトを作りたいのでしたら、WSHの本を買って読むことをお奨めします。 あるいはWSHで検索すればたくさんヒットしますので、それを見て勉強してはどうでしょうか。例えば、 http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh01/cformwsh01_01.html http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/wshtop.htm 特におすすめします。この方が書かれた本はわかりやすいと思います。 http://www.happy2-island.com/vbs/ ドキュメントは一通り読み、すぐ参照できるようにしておくべきです。 http://www.microsoft.com/japan/msdn/scripting/ マイクロソフトのスクリプトセンターはサンプルが豊富です。ただしサンプルはVBScriptが多いです。 http://technet.microsoft.com/ja-jp/scriptcenter/default.aspx ----- どういうスクリプトにしたいかはgya-1274さんの考え方次第なので、このようなQ&Aサイトで完成までやり取りするのは難しいです。 あえて「フォルダや空白、存在しないファイル名が代入された場合は無視する」ことについて回答しますと、WSHではFileSystemObjectのFileExistsメソッドでファイルの存在をチェックできますのでそれを使います。 if (objFs.FileExists(objArg(i))) // ファイルがあるときの処理 else // ファイルがないときの処理 なお、On Error Resume NextはVBScriptの構文です。WSHではJScriptとVBScriptが標準で用意されており、@ITのサンプルプログラムはJScriptで書かれていますのでOn Error Resume Nextは使えません(VBScriptで書いたとしても、ファイルの存在チェックはFileExistsメソッドで確認すべきです)。 JScriptとVBScriptがある、というはWSHの基本の基本ですので、ここから勉強するとなるとゴールは相当遠いものになると思われます。というわけで最初のアドバイスを申し上げた次第です。悪しからず。

gya-1274
質問者

お礼

とりあえずは、if (objFs.FileExists(objArg(i)))を使って Readエラーを回避することには成功し、スクリプトを使うことができました。 サンプルプログラムは明らかにVBScriptとは違っているのは気づいていたので WSHはJScriptとVBScriptが使えることで、少し納得しました。 これ以上のカスタマイズは、上記URLで勉強しながら進めて行こうと思います。 ありがとうございました。

その他の回答 (1)

noname#259269
noname#259269
回答No.1

On Error Resume Next を使う、でよいと思います。 On Error Resume Next ...(エラーが発生し得るコーディング。ファイルオープンなど) If Err.Number = 0 Then 'エラーが無い時 ...(続きの処理) End If どこまでできてどこで躓いているのか、 ソースコードも提示すれば回答が付きやすくなると思います。

gya-1274
質問者

補足

回答ありがとうございます。やはりOn Error Resume Nextなんですね。 下記のようにしてますが、「';'がありません。」 という構文エラーになります。 色々試しましたが、どこがおかしいのか分かりませんでした。 <?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?> <package> <job id="WordReplace"> <?job error="True" debug="True" ?> <object id="objFs" progid="Scripting.FileSystemObject" /> <script language="JavaScript"> <![CDATA[ strRepl="Shift_JIS"; /* 置換対象文字列 */ strWith="EUC-JP"; /* 置換文字列 */ var objArg=WScript.Arguments; for(i=0;i<objArg.length;i++){ strTmp= objFs.BuildPath (objFs.GetParentFolderName (WScript.ScriptFullName), objFs.GetTempName ()); On Error Resume Next; ←追記 var objTs =objFs.OpenTextFile(objArg(i),1,false); var objTs2=objFs.OpenTextFile(strTmp,2,true); If Err.Number = 0 Then  ←追記 do{ strLne=objTs.ReadLine(); strLne=strLne.replace(strRepl,strWith); objTs2.WriteLine(strLne); }while(!objTs.AtEndOfStream); objTs.Close(); objTs2.Close(); objFs.DeleteFile(objArg(i)); objFs.MoveFile(strTmp,objArg(i)); End If  ←追記 } ]]> </script> </job> </package>

関連するQ&A

  • WSHの文字置換ツールについて(サンプル改良)

    Windows2003server上で動く、文字列置換ツールを用意したいと思ってます。 ※同様の質問をもう一件あげていますが、質問の根本が違うのであえて分けています。 よろしければそちらもご覧頂ければと思います。 今、考えている動作をしてくれるサンプルプログラムが@ITにあったので これを流用しようと思うのですが、変換対象の文字列がプログラム内にハードコーディングされているため 設定ファイルとして外に出したいと思っています。 置換サンプルプログラム http://www.atmarkit.co.jp/fwin2k/win2ktips/308strrpl/strrpl.html 想定している使い方は以下の通りです。 ・変換対象ファイルは置換後上書き保存される。(サンプルPGの動作) ・変換対象文字のパターンは複数ある。 ・変換対象ファイル内に、変換対象文字は複数出てきて全てを置換する。 ・サンプルPGでは変換対象文字列がソース内に書かれているが、外部ファイルに出したい。 ・変換対象文字のパターンは今後増える可能性がありソース変更なしに柔軟に対応できるようにしたい。 文字列置換の動作自体はサンプルPGの動作が希望通りで問題ありません。 あとは、外部ファイルに変換対象文字を持たすことと、複数パターンに対応できるように 改良できればベストだと思っています。 外部ファイルの記述方法(左が変換前、右が変換後) AAA aaaa BB bbbbbb CCCC ccc  ・  ・ 増やした文だけ、変換対象となる。 ※変換文字に.や\が含まれます。(サンプルソースでは動いてます) よろしくお願いします。

  • windows7でファイル内の一連の文字列を置換

    Windows7を使用しており、テキストファイル内の特定の文字列(空白を含みます)の変換をしたく、簡単なバッチプログラムを作成したいのですが、色々NET内を検索しているのですが、自分の思っているものが見つかりません、下記の様な事をしたいのですが、SAMPLE.TXTの中に123456 SAMP1(6とSの間には空白を含みます)と999999 SAMP2(9とSの間には空白を含みます)の文字列があり、変換後には、 123456 SAMP1(6とSの間には空白を含みます)と999999 SAMP1(9とSの間には空白を含みます)に置換したいのです。全くの素人なので申し上げたい事がまとまりがないかもしれませんが、よろしくお願い致します。 SAMPLE.TXT(置換前) 123456 SAMP1 999999 SAMP2 SAMPLE.TXT(置換後) 123456 SAMP2 999999 SAMP1

  • バッチファイル(.bat)へWSH(.wsf)のエラーコードの返し方について

    はじめまして、kiwi88と申します。 バッチファイル(.bat)からwshスクリプト(.wsf)を呼び出すプログラムを作成しました。 そこで、wshスクリプトで実行されたエラーコードを呼び出しもとのバッチファイル(.bat)に返すことはできますでしょうか。 以下はバッチファイル(.bat)からwshスクリプト(.wsf)を呼び出す箇所のソースです。 ◆バッチファイル(test.bat)◆ ---------------------------------------- ~※処理内容省略~ cscript test.wsf //nologo //Job:wshscript > batch.log IF %ERRORLEVEL% NEQ 0 GOTO ERR exit :ERR set ret=%ERRORLEVEL% echo ****** [%:ERRORLEVEL=%ret%] ****** > err.txt exit %ret% ---------------------------------------- 以下はwshスクリプト(.wsf)のエラーコードを返す箇所のソースです。 ◆wshスクリプト(test.wsf)◆ ---------------------------------------- <job id = "wshscript"> <script language = "VBScript"> <![CDATA[ Option Explicit Function Main() ~※処理内容省略~ err = Err.Number Main = err End Function ]]> </script> </job> ---------------------------------------- 長くなってしまい、申し訳ありませんが、 ご教授願えますでしょうか。 宜しくお願いいたします。

  • 「ゞ」のみ置換するにはどうすればいいでしょう?

    「ゞ」を置換したいのに、 「ゞ」の次の文字まで置換されてしまう。 Sub test() Dim str会社名 As String str会社名 = "いすゞ自動車" Debug.Print Replace(str会社名, "ゞ", "ず") End Sub を実行すると 「ゞ自」が対象になってしまうのですが、 どうしてでしょうか? 「ゞ」は一文字ですよね? Replaceで「ゞ」のみ置換するにはどうすればいいでしょう?

  • excelマクロで特定文字を置換したい

    質問させてください。 excelマクロで特定文字を置換したい思っています。 <sample.txt> 【作業前】 ----------------------------------------- 実行日時     :2006/07/13 15:29:14 作業者アカウント名:sghdfrsgdsz 作業a名   :zsdfgdrfg 作業b名 :zdfgfdzdg 作業c名  :zdgdfgzdg ---------------------------------------- <sample.txt> 【作業後】 ---------------------------------------- 2006/07/13 15:29:14 sghdfrsgdsz zsdfgdrfg zdfgfdzdg zdgdfgzdg ---------------------------------------- 以下のような動作を実現したいと思っています。 1.上記の<sample.txt>をエクセルで開きます。 2.cell(A,1)を選択し、"実行日時     :"を""に置換します。 3.すべての行を置換します。 4.ファイルを閉じます。 ファイルを開くところ OpenFileName = strPath & "\" & Filename & ".txt" 'ファイル名を指定 Workbooks.Open OpenFileName は分かるのですが、セルを選択し、置換するところが分かりません。 どなたか知っていらっしゃる方いらっしゃいましたら教えていただけないでしょうか。 以上、大変お手数ですが宜しくお願い致します。

  • 秀丸 置換について

    NASのログをDB取り込み用の、テキスト修正を秀丸で行っているのですが、うまく置換できません。 ○文字列 Jan 12 13:25:19 "NASホスト名" file_smb[17142]: [User:”ユーザー名”(192.168.133.22)] ”File Open””(Read)” /mnt/array1/”フォルダ名”/”サブフォルダ名"/”ファイル名” ※”文字列”の中は変化します。 ○置換後 日時 ,”NASホスト名”,"ユーザー名",”IPアドレス",File Open,(Read),"フォルダ名",”サブフォルダ ファイル名” 【問題】   "(" → ","   ")" → "," で置換をかけていたのですが、ファイル名に"(” ”)"を使われており、一気に置換できません。 出来るかわかりませんが例えば、先頭から100文字目までの、"("を","へ置換する等 うまく置換できる方法をアドバイス頂けましたら幸いです。

  • ファイル名に含まれるスペースなどの任意の文字を置換したい

    ファイル名に含まれるスペースなどの任意の文字を置換したい ファイル名にスペースがあるとバッチファイルで読み込めないです。 なので、たとえば別に作成したバッチファイルを実行すると、 任意のフォルダ内にあるファイルの、ファイル名に含まれるスペースを、 アンダーバーなどの別の文字に置き換えたりできるといいです。

  • PowerShellで置換したTXTを吐かせるには

    type a.txt|%{$_ -replace "[  ]+$", ""}|?{$_ -notmatch "^$|^Power Shell$|^-+$"}|%{$_ + "."} で先日空白行の置換をご教示いただいたのですが、このテキストをoutputfileさせようとするとエラーになってしまいます。 どうやらプロセスで掴んでいるようなエラーになってしまうのですが・・・回避策はないでしょうか?

  • 正規表現のタイプがわからない(初心者)

    正規表現で置換ができることを知り、こういうサイトを見つけました。 @IT:Windows TIPS -- Tips:複数ファイルの文字列置換をワンクリックで行なう http://www.atmarkit.co.jp/fwin2k/win2ktips/308strrpl/strrpl.html そこでreplace.wsfを作りましたが、正規表現がうまくいきません。 replace.wsfは正規表現を使う場合は "/ /g" で囲うらしいのですが urlのようなスラッシュ / が多いものを円記号 \ でエスケープしましたがうまくいきません。 さらに http://msdn.microsoft.com/ja-jp/library/aa293063(VS.71).aspx というサイトで任意の文字をドット . で置換したいんですができません。 以下書いたものを載せます 文字はアンダーバー _ で書いています strRepl="/http:[\/][\/]______.____.jp[\/]____/____[\/][0-9][0-9][0-9][0-9][\/][0-9][0-9][\/][0-9][0-9]/g"; /* 置換対象文字列 */ [\/]はかっこなしでも試しましたができませんでした [0-9]の部分は年月日が入ります。 replace.wsfで正規表現を実現させることができません。 正しい方法を教えてください!!

  • フォルダ内のファイル名を一括変更したい

    windows10を使っています。 指定したフォルダ内のファイル名を一括変更したいです。 具体的には、以下のようにファイル名内の空白を「_」に置換したいです。 変更前:スクリーンショット 2021-01-01 104535.jpg ↓ 変更後:スクリーンショット_2021-01-01_104535.jpg バッチファイルで手軽に実行できるとうれしいです。 やりたいことの具体例: 空白置換.batを実行したら、空白置換.batが置いてあるフォルダ内のファイル名が一括変更できる。 空白置換.bat内で、変更対象とする拡張子を指定できる。 よろしくお願いいたします。

専門家に質問してみよう