- ベストアンサー
VBS内で検索して設定を自動に切り替える方法。
VBS内で検索して設定を自動に切り替える方法。 ファイル入力から自動でVBS内で適用する物を自動化したいのですが・・・お知恵を。 入力するファイルには必ず特定のキーワードがある物で 特定キーワードごとに決まった処理をしたい物とします。 例 1_インド.doc 2_タイ.doc この場合のように末尾近辺にあるワードのキーとして切り替えられたらと・・思います。 インド=1 タイ=2 Const PROFILE = 1 Const PROFILE = 2 な感じにそのプロファィルを変える方法をとりたいのですが・・・。 どういう方法取ればいいんでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
>Const PROFILE = 5 >とはならない そうでしょうねぇ。 >Const PROFILE = " & PROFILE & " では PROFILE という定数に「 & PROFILE & 」という文字列が格納されるだけです。 >厳密にはconst宣言させる >caseごとにconstと言う訳ではなく二重に宣言してしまう 何故、[Const ステートメント] をお使いになりたいのか、その理由が分かりませんが、[Const ステートメント] というのは、リテラル値の代わりに使う定数を宣言する ステートメント ですよね。 で、「リテラル値」というのは、値が変化しないプログラム要素のことですから、値の変化する「PROFILE」を [Const ステートメント] で宣言するのはおかしいと存じますよん。 VBS では、「Option Explicit」が書かれていなければ「変数」・「定数」の宣言は省略できたかと存じますが、強いて宣言するなら、 Dim PROFILE でよいのではないでしょうか? >最終的に入力に対して自動で選択する >取り敢えずソース晒し とのことですが、回答6 の サンプルコード の中では、 Exit For した時点で、 KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") という配列変数の中の「東京」という キーワード の インデックス番号 を取得しています(i の現在値)。 その i の値を元に、 PROFILE = i + 1 として、PROFILE という変数に「キーワード の インデックス番号 + 1」の値を格納していますから、その後で、わざわざ Select Case する必要はありませんし、間違いの元ですね。 回答6 の サンプルコード 内では、 ・ファイル名に "東京" が含まれるときには「PROFILE」という変数に「1」を ・ファイル名に "大阪" が含まれるときには「PROFILE」という変数に「2」を ・ファイル名に "茨城" が含まれるときには「PROFILE」という変数に「3」を ・ファイル名に "兵庫" が含まれるときには「PROFILE」という変数に「4」を ・ファイル名に "千葉" が含まれるときには「PROFILE」という変数に「5」を 格納しています。 ですから、「Select Case する」のではなく、 PROFILE = i + 1 の1行を sakusa001 さんの望まれる「文字列」・「数値」になるように変えるべきです。 例)PROFILE = i 例)PROFILE = "PROFILE" & i 例)PROFILE = "PROFILE" & i + 1 あるいは、 例)PROFILEKW = Array("新宿区", "大阪市", "水戸市", "神戸市", "千葉市") PROFILE = PROFILEKW(i) なお、VBS の コード をお書きになるときには、 Const PROFILE = " & PROFILE & " WScript.Echo PROFILE などとして、逐一、「変数」や「定数」の内容を確認されることをお薦めいたします。
その他の回答 (6)
- DOUGLAS_
- ベストアンサー率74% (397/534)
ん~。。。 やっぱり、私には、sakusa001 さんのなさりたいことがイマイチ分からないのですが。。。 a)「***.VBS」に「●●●_○○○.TXT」を D & D する。 b)「***.VBS」内の プログラム により、「○○○」の部分(ファイル名の一部)を取得する。 c)(b) で取得した ファイル名 により「PROFILE」を割り振る。 d)(c) で割り振られた「PROFILE」により、それ以後の処理を分岐する。 というようなことでしょうか? ということでしたら、やはり、 1)キーワード を配列に格納しておく。 2)配列に格納された キーワード を For ~ Next で回して、1つずつ ファイル名「●●●_○○○.TXT」と マッチング する。 3)(2) で マッチ した キーワード の配列内における インデックス番号 を取得する。 4)(3) で取得した インデックス番号 により、「PROFILE」を割り振る。 5)(4) で割り振られた「PROFILE」により、それ以後の処理を分岐する。 というような段取りになろうかと存じます。 そこで、回答5に対する「お礼」に書かれた コード で申せば、下記のような感じになろうかと存じます。 下記の VBS ファイル に「111_東京.txt」という ファイル を D & D すると、 ---------------------------------------------------- D & D された ファイル名 には、KeyWord 配列 の1番目の要素「東京」が含まれます。 PROFILE は「PROFILE1」です。 ---------------------------------------------------- と表示されます。 ということで、 1)キーワード を配列に格納しておく。 の操作、つまり、 KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") の部分を コード に書かないと無理っぽいですね。 '-- これより VBS コード ---------------------------- '変数を宣言 Dim FS Dim file KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") If WScript.Arguments.Count <> 1 Then WScript.Quit (0) End If Set fso = CreateObject("Scripting.FileSystemObject") file = WScript.Arguments(0) base = fso.GetBaseName(file) Set objregexp = New regexp For i = 0 To UBound(KeyWord) objregexp.Pattern = KeyWord(i) myval = objregexp.test(base) If myval Then Exit For End If Next WScript.Echo "D & D された ファイル名 には、KeyWord 配列 の" & _ i + 1 & "番目の要素「" & KeyWord(i) & "」が含まれます。" PROFILE = i + 1 WScript.Echo "PROFILE は「PROFILE" & PROFILE & "」です。"
補足
最終的に入力に対して自動で選択する(厳密にはconst宣言させるのですが) Const PROFILE =" & PROFILE & " では Const PROFILE =" & PROFILE & "(5入力仮定) Const PROFILE = 5 とはならないようで しょうがないので& PROFILE &を使ってselect caseする事にしたのですがslect case以降はcaseごとにconstと言う訳ではなく二重に宣言してしまうんですが 取り敢えずソース晒して又暫く改変します。 PROFILE = i + 1 WScript.Echo "PROFILE は「PROFILE" & PROFILE & "」です。" Select Case Replace(" & PROFILE & ") Case 6 Const PROFILE =5 Case 7 Const PROFILE =6
- DOUGLAS_
- ベストアンサー率74% (397/534)
●回答4に対する「補足」について >KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") >()内Case 1 Case 2 Case 3と言うふうにカウントするんでしょうか? [Array 関数] の解説には「配列が格納されたバリアント型 (Variant) の値を返します」という説明が書かれていますが、要するに KeyWord という 要素数5 の配列変数を宣言している訳です。 ここで、例えば、 KeyWord(0) = "東京" なのですが、逆引きで「東京」から KeyWord の インデックス番号「0」を返す関数を私は存じません、と 回答2 に書いた訳です。 ですので、 >KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") から、いきなり >()内Case 1 Case 2 Case 3と言うふうにカウントする ことはできない(私は、その手法を存じません)ので、その回避策として、回答3 の2つ目の サンプルコード を呈示しました。 問題がややこしくなりますので、この件は、ちょっとおいておきましょう!!! ●回答4に対する「お礼」について >この二つのVBSの違いを知りたいのですが。 >これで何故同等の機能を発揮しないのでしょうか? プログラム の コーディング をするときには、 ・ミススペル は禁物 また、2つの コード を比較するときには ・比較する部分以外の コード は変更しない というのが最低の条件です。 お示しの2つの コード をよく見ると、1つ目の コード の objregexp.pattern = "東京" myval = objregexp.test("今日のおかず_東京") if myval then の部分が、2つ目の コード では、 myval = objregexp.test(bese) if myva then となっています。 まず、「if myva then」は「if myval then」の誤りですね。 次に、 myval = objregexp.test(bese) は objregexp.pattern = bese myval = objregexp.test("今日のおかず_東京") とすべきです。 しかも、 base = fso.Getfilename(file) では、「東京.txt」というように拡張子が付いてしまいますので、回答1の1つ目の 参考URL をよくご覧になって base = fso.GetBaseName(file) と直すと、拡張子を除いた「東京」という文字列を返すことができます。 ということで、2つ目の コード を下記のように訂正すると、この VBSファイル に「東京.txt」を D & D すると、「yes」が返ります。 つまり、1つ目の コード と「同等の機能を発揮」できるようになります。 '変数を宣言 Dim FS Dim file If WScript.Arguments.Count <> 1 Then WScript.Quit(0) End If Set fso = CreateObject("Scripting.FileSystemObject") file = WScript.Arguments(0) base = fso.GetBaseName(file) set objregexp = new regexp objregexp.pattern = bese myval = objregexp.test("今日のおかず_東京") if myval then msgbox "yes" else msgbox"no" end if
お礼
綺麗な作り考えず不細工な作りで考えてやってみたら構文合ってるのかどうか疑問ですが「機能」はしたんで取り敢えずアップです。 単に一つづつファイルに対してキーワード合わせてやれるだけやってみよう的感じです。 多分yesに返すときに代わりに実際使うプロファイルの構文挿し込めば後はnoでスルーので 機能するんじゃないかぁと思う・・・って感じです。 一応実際の組み込みはやっていないのですが想定出来る感じのミニマム実験はしてみたので 汚いのですが機能するぽいです。 (実験部分) set objregexp = new regexp objregexp.pattern = "東京" myval = objregexp.test(base) if myval then msgbox "yes" (実際のソース) set objregexp = new regexp objregexp.pattern = "東京" myval = objregexp.test(base) if myval then Const PROFILE = 1 '変数を宣言 Dim FS Dim file If WScript.Arguments.Count <> 1 Then WScript.Quit(0) End If Set fso = CreateObject("Scripting.FileSystemObject") file = WScript.Arguments(0) base = fso.GetBaseName(file) set objregexp = new regexp objregexp.pattern = "東京" myval = objregexp.test(base) if myval then msgbox "yes" else msgbox"no" end if set objregexp = new regexp objregexp.pattern = "千葉" myval = objregexp.test(base) if myval then msgbox "yes" else msgbox"no" end if
- DOUGLAS_
- ベストアンサー率74% (397/534)
まず、お詫びですが、回答2に対する "お礼" を見落としておりました。 <(_ _)> >ちょっと自動検索する部分何とか作ってみました >これなら長さとか形状に関係なく絞り込めるみたいです。 とのことですが、これは、「実際、sakusa001 さんの目の前にある」処理作業においては、『そういう コード が有効なんだなぁ』というのが私の正直な感想です。 目の前の問題の状況によって、当然ながら適切な コーディング が変わってきましょうから。。。 「回答2に対する "お礼" を見落とし」た状態での「回答3」でしたので、見当違いな的外れな回答になったかも知れませんね。大変、失礼いたしました。 次に、回答3に対する "お礼" の >111_東京.txt→東京(KeyWord(i)=profile1 >と言う感じの部分 >Select Caseにどう東京をcaseと伝えるのか についてですが、やはり、回答3のような感じで、 ・キーワード を配列などに格納しておく ・一方、ファイル名 は キーワード と マッチング しやすい状況まで切り出す ・その後、キーワード配列 の中から ファイル名 を検索する というのが一般的な段取りではないかと存じます。 時間がかかっても構いませんので、また、何か問題点がございましたらご相談ください。私にできる範囲でお付き合いさせていただきます。 さて、 >VBSの教本とか基本的部分書いている物が少なく についてですが、「VBScript」で WEB検索 すると、上位に、リファレンスっぽい WEBページ がたくさん検索されます。 http://www.google.co.jp/search?q=VBScript >超基本 ある程度の技術この間程度の知識が中途半端に知る 現時点で、ご自分の知りたいこと、例えば、それが「分岐処理」とすると、「VBScript 分岐処理」とか「WSH 分岐処理」というような 検索ワード で WEB検索 し、検索結果を1つずつ見ていくのが、私の場合の常套手段です。(「WSH」は「Windows Scripting Host」の略?) なお、ご存じかも知れませんが、EXCEL の VBA(Visual Basic for Application)がお出来になるのでしたら、VBSファイル の コード を EXCEL の VBE(Visual Basic Editor)の コードウィンドウ の「Sub Macro1() ~ End Sub」の間に貼り付けると、殆どの ステートメント を デバッグ できますので便利です。 つまり、VBA で使える メソッド・プロパティ などが、そのまま殆ど VBS でも使えます。
お礼
エクセルのは使いたいのですが・・持ってないので残念な所。 一番強力なVBSエディターだとは聞いてはいるのですが 自分の知識のちょっと外ぽい事なんですがこの二つのVBSの違いを知りたいのですが。 set objregexp = new regexp objregexp.pattern = "東京" myval = objregexp.test("今日のおかず_東京") if myval then msgbox "yes" else msgbox"no" end if と '変数を宣言 Dim FS Dim file If WScript.Arguments.Count <> 1 Then WScript.Quit(0) End If Set fso = CreateObject("Scripting.FileSystemObject") file = WScript.Arguments(0) base = fso.Getfilename(file) set objregexp = new regexp myval = objregexp.test(bese) if myva then msgbox "yes" else msgbox"no" end if d&d部分が適当ですが意味合いだけで考えて欲しいのですが myval = objregexp.test("今日のおかず_東京") 今日のおかず_東京.TXT(base)→myval = objregexp.test( " & bese & ") これで何故同等の機能を発揮しないのでしょうか? ( " & bese & ")でも( bese )でも機能しないみたいですし 多分完全に考え違いだとは思うのですが・・・ これが変数じゃなきゃ意味の無い話ですし・・。
補足
回答有難う御座います。 自分はたまに自分で答えを言って質問してしまう変な所がるんですが 今回もそれかも知れないです。。。。 まだやってないのですが今の段階でのvbsの知識からやれる手段だと 自分が提供したfileから種類を割り出すソースを使いそれをケースセレクトとして使えばその段階でfileネームが不定形な物から定形に絞られているはずなので・・・。 何とも間抜けなお話です・・・ selct caseの部分の質問なのですが KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") ()内Case 1 Case 2 Case 3と言うふうにカウントするんでしょうか? まぁ・・・もうちょっと頑張ります。 気が向いたら10分位づつ触る感じで前進しにくいので申し訳ありません
- DOUGLAS_
- ベストアンサー率74% (397/534)
>111_東京.txt >3333_東京.txt >等と変則名+キーワードだと変則名が壁となってしまう ファイル名 が、必ず「変則名_キーワード.拡張子」という形でしたら、下記のようなことで、「キーワード」だけを切り出すことはできます。 Filename = "111_東京.txt" Filename = Split(Split(Filename, "_")(1), ".")(0) WScript.Echo Filename もっと変則的な ファイル名 の場合は、下記のように、キーワード を For ~ Next で回して取得することもできます。 KeyWord = Array("東京", "大阪", "茨城", "兵庫", "千葉") Filename = "111_東京.txt" For i = 0 To UBound(KeyWord) If InStr(Filename, KeyWord(i)) > 0 Then Exit For Next WScript.Echo KeyWord(i) ただし、「東京」・「西東京」などのような一部が重複する キーワード が存在する場合は、もっと ケアフル な方途を考えなければなりません。
お礼
毎回申し訳ありません>< 暫くソース作って提供されたソースの構造がようやく分かって自力でも頑張っているのですが VBSの教本とか基本的部分書いている物が少なく超基本 ある程度の技術この間程度の知識が中途半端に知るので大変ご迷惑書けていると反省する事しきりです。 今やっているのは Filename = "111_東京.txt" ←これはD&D化これは出来ます>< 次に 111_東京.txt→東京(KeyWord(i)=profile1 と言う感じの部分 Select Caseにどう東京をcaseと伝えるのかと言う所です 絶対単純な部分だと思うので聞くよりは何とか頑張って答え出したかったのですが・・・。
- DOUGLAS_
- ベストアンサー率74% (397/534)
>スクリプト上で文字列のマッチングのやり方が分からない 考え方は幾通りもあろうかと存じますが、前回答にも書きましたように、 ・「特定キーワード」が何十個もあるというお話 だったり、 ・その後の処理との関連性の有無 が回答者にとっては重要になってくるかと存じます。 1つの考え方として、「特定キーワード」を配列に格納しておき、取得した ファイル名 をその配列の要素から検索して インデックス番号 を返すというようなことが考えられますが、WSH において、私は、この「配列の要素の検索」という手法を存じません。 替わりに、下記のような段取りを考えてみましたが、いかがでしょうか? #ダサイ コード で申し訳ございませんが。。。 strProcess = Array("関東", "関西") KeyWord = Array("東京1", "大阪2", "茨城3", "兵庫4", "千葉5") Filename = "茨城" strIndex = Filter(KeyWord, Filename) Select Case Replace(strIndex(0), Filename, "") Case 1, 3, 5 PROFILE = 0 Case 2, 4 PROFILE = 1 End Select '主要部分の定番処理 WScript.Echo Filename & "は" & strProcess(PROFILE) & "です。"
お礼
set objregexp = new regexp objregexp.pattern = "東京" myval = objregexp.test("今日のおかず_東京") if myval then msgbox "yes" else msgbox"no" end if ちょっと自動検索する部分何とか作ってみました これなら長さとか形状に関係なく絞り込めるみたいです。 後は複数の要素組み込んデムちゃんと行けるのか・・・ケース処理参考にさせて頂きます
補足
ダサいコードなんてそんな事は同等かせめて近い事が答えられる人間の言う事なんで 全く思ってません。 >>その配列の要素から検索して インデックス番号 を返すというようなことが考えられますが、WSH において、私は、この「配列の要素の検索」という手法を存じません。 やはりそうかも知れないのですね。 取り敢えず現段階では 汎用的プロフィル部分+(特定プロファイル要素+基本動作)と2ファイル構成で特定プロファイル分のvbsを作って対応しています。 今の使い方だと特定プロファイルはせいぜい20個程度なので少ない構成で考えられるんじゃないかとは思います。 selectcase使う方法は何とか想像出来ていたのですが詰まった所はfilenameの段階でして 例えば 111_東京.txt 3333_東京.txt 等と変則名+キーワードだと変則名が壁となってしまうので今現在調べている所です。 確か特定要素からダイレクトに検索は出来なかったとは思うのですが 削って洗い出すなら出来るような気がしたので・・・・。 wshも簡単では無いので取り敢えずもっと頑張ります。
- DOUGLAS_
- ベストアンサー率74% (397/534)
#ご質問の主旨が判然としませんが。。。 「入力するファイル」の名前を VBS 内でどのように把握しているかによって、操作も多少変わるかも知れませんが、 ●WSHスクリプトからのファイル操作 http://www.atmarkit.co.jp/fwin2k/operation/wsh11/wsh11_02.html あたりをご参考にして、拡張子を除いた ファイル名 の ベース名 を取得し ●選択(Select文) http://www1.u-netsurf.ne.jp/~tomo_c/tips/WSH001.html#WSH007 あたりをご参考にして、Select文 で分岐処理するとか。。。 まぁ、「特定キーワード」が何十個もあるというお話であれば、もう少し他の操作も考えなければなりませんし、ファイル名 と分岐後の処理内容に関連性があるのでしたら、わざわざ分岐する必要もありませんし。。。で、実際、sakusa001 さんの目の前にある コード の主要部分だけでもお示しになるとか、キーワード の数や、その後の処理との関連性の有無など、もう少し詳しくお示しになった方が、有益な回答が得られるかと存じます。
補足
確かに漠然としているとは思います・・。 どちらかと言うと主要部分は定番処理させてこの部分は新規で組み込むパートなので ソースつくろうとして調べている次第でして。 言い訳ぽくって申し訳ありません。 ファィル名の取得位ならまぁ何とか出来るのですがスクリプト上で文字列のマッチングのやり方が分からない所です。 その後の部分は確かにselect文で行けるので明日仕事から帰ってきたらもう少し考えまとめてみます。 ご参考になる意見有難う御座います。
お礼
まずスクリプトの件は本体の組み込みまで確認してOKでした。 で問題点だった事は 構造の認識不足では無く無知と言う所ですね。 一部人から与えられたコードを改変していたのですが自分の与えたい値の部分は別の部分にあったと言う感じです。 東京1 千葉2 profile=1or2 で止まっていなく ソースコードの中に Const PROFILE = 3 Call edf("setprof", CStr(hwnd) & " " & CStr(PROFILE)) 出力先がある事が原因でした。 PROFILEを直接profile=1or2にする事で目的に達すると言う事でした。 色々より道したおかげで色々基本にも触れれたので有り難い感じでした。 本当に親切に有難う御座いました!! みたいに