ただし さん 2004年 03月 04日 08時 45分 23秒

いりやさん、おはようございます。

ご助言ありがとうございました。試して見ます。いよ
いよJScriptへ鞍替えせねばなりませんね。良い刺激に
なります。

貴ホーム・ページ拝見。ご立派な経歴で多方面にご
活躍なんですね。NSBASICってあるんですか。私てっ
きり昔昔のNBASICかと思いました。年ばれるかな。

そうですかHPにお勤めだから英語も堪能でらっしゃ
るんですね。確か女性のCEOだったですね。 
Compaqとの合併話には驚きました。

サーバー側に立って来た自分としては正直言って逆
じゃないのかなと思いました。職場ではクライアン
ト・マシンにも使われていますが、HP Compaqって
ロゴが入ってる。

プリンターやスキャナーにはこれで良いのかもしれ
ないが、マシン、特にサーバーにはCompaq HP が正
しい!爆笑

ハード・ソフト共お世話になってます。




いりや さん 2004年 03月 04日 02時 08分 22秒
URL:http://iriyak.adam.ne.jp/wiliki/uwsc.cgi?iriyak&l=jp

ただしさん、

まずはやりたいことが達成できてなによりです。

ところで、

| 全体の流れとしては
|
| WScript.CreateObject("Microsoft.XLMHTTP")を使って目標
| のWebサーバーに接続しWScript.CreateObject("Adodb.Stream")
| でHTMLを書き込み保存する。
|
| CreateObject("Scripting.FileSstemObject")で取り込んだファ
| イルと書き込み用のファイルを開いておき、正規表現
| .Pattern="<(.|\n)+?>"でタグを全部取り払う。
|
| 余計なものが混じってるのでもう一度正規表現を使ってパターンに
| マッチした部分を切り出す。ここまでは一つのスクリプトで書けたの
| ですが、並べ替えが出来ませんでした。

こちらですが・・・もしかしたら Dynamic HTML Object Model に沿って欲しいデータの
系列を HTML から抜き出すアプローチが適用できるかもしれません!!

msdn, HTML and Dynamic HTML
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/dhtml_node_entry.asp

これまでいくつか取り組んだことがあります。サンプルをご紹介します。ご参考になれ
ば幸いです。

[ 内容 ]

example1() は、WSH Lab.掲示板の過去の記事リストを取得します。ページの末尾にある
アンカーを順番にたどっていき、Anchor オブジェクトの innerText 属性と href 属性
をカラムにもつタブで区切られたレコードをファイルに書き出します。

example2() は、JRA サイトから\n平成15年度重賞競走勝ち馬一覧表(関東)を取得します。
これは Table オブジェクトの内容を CSV 書式のデータとしてファイルに書き出すもの
です。

特徴は、Dynamic HTML Object Model に沿って getElementsByTagName() メソッドなど
をつかって欲しいオブジェクトやそれらの集まり (コレクション) を得るというところ
です。素の HTML ソース (文字列データ) を操作の対象としません。HTML ソースのパー
ス (構文解析) 処理を終えたパースツリー (構文解析木) を操作の対象とすることで、
パースの機能を外だしにできること、また操作の対象の粒度が文字列にくらべ粗く (大
きく) なるのでやや処理をかんがえるのが楽になります。そのあたりは各行でやってい
るところをご覧いただければとおもいます。


[ 実行の仕方 ]

dynamic-html.js というファイル名で保存する。ダブルクリックすると実行を開始する。
なお example2() はちょっと時間がかかるかもしれません。気長に「処理を終了しまし
た」というダイアログが表示されるまでお待ちください。


[ 参考リンク ]

さきほどの msdn のサイトはもちろんですが、下記他サイトの投函も似通った話題とい
う意味では参考になるかとおもいます。UWSC については、
http://www002.upp.so-net.ne.jp/umiumi/
を。

http://hidebbs.net/bbs/umiumi?s=7&n=19683658
http://hidebbs.net/bbs/umiumi?s=7&n=16815696
http://hidebbs.net/bbs/umiumi?s=7&n=16899636


[ ソースコード (WSH/JScript) ]

var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
var WScriptShell = new ActiveXObject('WScript.Shell');

example1();
example2();
WScript.echo('処理を終了しました');

function example1() {
    WScript.echo('WSH Lab.掲示板の過去の記事リストを取得します');
    var anchorListFile = createFile('.\\anchorList.txt');
    var writeStream = file→writeStream(anchorListFile);
    var e = new InternetExplorer('InternetExplorer1_');
    try {
        e.visible(true);
        e.navigate('http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml');
        var ulCollection = e.source.document.getElementsByTagName('UL');
        var ul = ulCollection.item(0);
        var anchorCollection = ul.getElementsByTagName('A');
        for (var i = 0; i < anchorCollection.length; i++) {
            anchor = anchorCollection.item(i);
            writeStream.write(anchor.innerText);
            writeStream.write('\t');
            writeStream.writeLine(anchor.href);
        }
    } finally {
        writeStream.close();
        e.quit();
    }
    return; // .\\anchorList.txt ファイルを開きたい場合はこの行 (return;) を削除する
    var doubleQuote = function (s) {
        q = String.fromCharCode(34);
        return new Array(q, s, q).join('');
    }
    WScriptShell.run(doubleQuote(anchorListFile.path));
}
    
function example2() {
    WScript.echo('JRA サイトから\n平成15年度重賞競走勝ち馬一覧表(関東)を取得します');
    var csvFile = createFile('.\\example2.csv');
    var writeStream = file→writeStream(csvFile);
    var e = new InternetExplorer('InternetExplorer2_');
    try {
        e.visible(true);
        e.navigate('http://www.jra.go.jp/datafile/kachiuma/2003east.html');
        var tableCollection = e.source.document.getElementsByTagName('TABLE');
        var table = tableCollection.item(2);
        for (var r = 0; r < table.rows.length; r++) {
            for (var c = 0; c < table.rows.item(r).cells.length - 1; c++) {
                var s = table.rows.item(r).cells.item(c).innerText;
                writeStream.write(s.replace(/\n/g, ''));
                writeStream.write(',');
            }
            var s = table.rows.item(r).cells.item(c).innerText;
            writeStream.writeLine(s.replace(/\n/g, ''));
        }
    } finally {
        writeStream.close();
        e.quit();
    }
    return; // .\\example2.csv ファイルを開きたい場合はこの行 (return;) を削除する
    var doubleQuote = function (s) {
        q = String.fromCharCode(34);
        return new Array(q, s, q).join('');
    }
    WScriptShell.run(doubleQuote(csvFile.path));
}

function filepath→file(filepath) {
return FileSystemObject.fileExists(filepath) ? FileSystemObject.getFile(filepath) : null;
}

function file→writeStream(file) {
var ForWriting = 2;
var TristateUseDefault = -2;
return file.openAsTextStream(ForWriting, TristateUseDefault);
}

function createFile(filepath) {
if (!FileSystemObject.fileExists(filepath))
FileSystemObject.createTextFile(filepath, true); // 2nd arg : overwrite
return FileSystemObject.getFile(filepath);
}

function InternetExplorer () {
    var prefix = arguments.length == 1 ? arguments[0] : 'InternetExplorer_';
    this.source = WScript.createObject('InternetExplorer.Application', prefix);
    this.visible = function () {
        if (arguments.length == 0)
            return this.source.visible;
        if (arguments.length == 1 && typeof(arguments[0]) == 'boolean') {
            this.source.visible = arguments[0];
            return this.source.visible;
        }
    }
    this.navigate = function () {
        if (arguments.length == 0) {
            this.source.navigate('about:blank');
            this.waitForever();
        }
        if (arguments.length == 1 && typeof(arguments[0]) == 'string') {
            this.source.navigate(arguments[0]);
            this.waitForever();
        }
    }
    this.waitForever = function () {
        while (this.source.busy || this.source.readyState != 4)
            WScript.sleep(0.1 * 1000);
    }
    this.waitWithTimeout = function (timeout) {
        var waitSecs = 0.1;
        var elapsedSecs = 0;
        do {
            if (elapsedSecs > timeout)
                return false;
            else {
                WScript.sleep(waitSecs * 1000);
                elapsedSecs = elapsedSecs + waitSecs;
            }
        } while (this.source.busy || this.source.readyState != 4)
        return true;
    }
    this.quit = function () {
        this.source.quit();
        this.source = null;
    }
}

ただし さん 2004年 03月 03日 21時 22分 17秒

拝啓、いりやさん、むたぐちさん

教えて頂いた方法を試して見ました。結果ご報告致します。長くなり
ますが読者の方々も参考にして頂ければ幸いです。

希望「サンプル文字列を次のように置き換える。」

AAA(CrLf)
BBB(CrLf)
CCC(CrLf)
(CrLf)
DDD(CrLf)
EEE(CrLf)
FFF(CrLf)
(CrLf)


目標

AAA(Tab)BBB(Tab)CCC(CrLf)
DDD(Tab)EEE(Tab)FFF(CrLf)


むたぐちさん案 その1: 多段Replace

sOutput=Replace(Replace(Replace(sInput,vbCrLf & vbCrLf,Chr(0)), &_
vbCrLf,vbTab),Chr(0),vbCrLf)

Replaceの使い方は知っていましたが、このように親亀、子亀、孫亀式に
重ねられるとは思っても見ませんでした。見事に置き換わりましたが一本
のながーい文字列になってしまった。さては?

> 入力データのフォーマットが絶対的に保証されてるなら、

バイナリー・エディターで開いてみるとデーターの区切りは(tab)(20)(20)
(tab)となっており、スペースが二っも入ってる。ん、おかしいぞ?無から
有は生まれない。元を当たらねば。

うーん、なんと元データーの空行の後に空白スペースがまだ二つ、残っ
ていました。

何度かタグや不要な部分を除く前処理のスクリプトを書き直し解決し
たと思ってましたが、どうやら未熟なスクリプトで出力したデーターを使っ
ていたようです。

正しいデーターで実行してみると無事置き換わり見かけはよさそうです。

AAA BBB CCC
DDD EEE FFF

なお、サンプルの実物には二行目に含まれるカラムには最小1から最
大5までばらつきがあってカラムの間にはシングル・スペースが入ります。

AAA 
BBB 1B1B2 B2B2B2 B3B3B3 B4B4B4
CCC

これも見事に

AAA BBB B1B1B1 B2B2B2 B3B3B3 B4B4B4 CCC

と並べ代わりました。



むたぐちさん案 その2:For ループ

For Each s In Split(strHTML,vbCrLf & vbCrLf)

  sOutput = sOutput & Replace(s,vbCRLf,vbTab)

Next

元の長い文字列を空行の所でばらしてレコード単位にし行末の改行
をタブに置き換える処理をループで繰り返す方法ですね。これも結果
オーライです。

念の為に結果をバイナリー・エディターでチェックして見ると見事に各カラ
ムはタブ文字(09)で区切られ、行末には(0D)(0A)=CR・LF(復帰・
改行)が入っています。

SQLにDTSでImportしてもちゃんとTAB刻みのテーブルが出来ました。

なお日付けを後のSQL側で入れようかとも思ってたんですが、こちらで
入れるようにし、ループの中にMMM/DDD/YYY形式で直接書き込ま
せて頂きました。

sOutput = sOutput & Month(now) & "/" & Day(now) & "/" &_
& Year(now) & vbTab & Replace(s,vbCRLf,vbTab) & vbCrLf


いりやさん案:JScriptでカラムを詳細に調べ配列に取り込み該当す
るものを出力。

きちんと基本を守ってらっしゃり流石ですね。残念ながら私はまだ
JScriptは良く分かりません。MSは次世代のOS思想ではVBSの
ネット周りはサポートしないと表明してますね。.Framework等。

これから生き残って行くにはVBSからJSに切り替えないとい
けないと思いつつ、目先のことに終われてVBSに頼ってしまう。
前処理もVBSで書いて来ました。全体の流れとしては

WScript.CreateObject("Microsoft.XLMHTTP")を使って目標
のWebサーバーに接続しWScript.CreateObject("Adodb.Stream")
でHTMLを書き込み保存する。

CreateObject("Scripting.FileSstemObject")で取り込んだファ
イルと書き込み用のファイルを開いておき、正規表現
.Pattern="<(.|\n)+?>"でタグを全部取り払う。

余計なものが混じってるのでもう一度正規表現を使ってパターンに
マッチした部分を切り出す。ここまでは一つのスクリプトで書けたの
ですが、並べ替えが出来ませんでした。

何故、

AAA
BBB
CCC

DDD
EEE
FFF

タブ区切りにしたいかは、二行目のカラム数にもばらつきがあるし、三
行目は数字でこれも桁数にばらつきがあり、コンマが使われているの
で簡単なCSVには持って行けないからです。

邪魔な文字を別のものに一時的に置き換えて後から直すのは良くや
りましたが、今はsed、awkは使えない。サンプルを魚屋の例えにする
と、三行目は価格です。

外道物
東京湾
0.25

いか
遠洋物 アフリカ産
120.00

本マグロ
神奈川県 三崎漁港 凸凹水産
12,000.00

穴子
兵庫県 明石漁港 穴子取り名人 穴子取蔵
2,500.00


折角教えて頂いたのですが「いりやさん案」は今後の課題とし、まず
VBスクリプト拙作が働くのを確認してから、全てJScriptに書き直す
時に使わせて頂きます。ご好意は忘れません。


ついでにこの前ご紹介した一行使い捨てawkスクリプトはあまりに荒
っぽいので少し真面目に書いておきます。

ここ一年位Unixの白黒画面でまともなことはしていないので基本
的なコマンドすら忘れかけてます。環境はGUIクライアントにしてる
RedHat Linux 7.3(Valhalla)に純正GNU Awk 3.1.0とLarry
Wall先生直伝のPerl v5.6.1です。

まずエディターを開いて、

#前処理、対象文字列はフィールドが改行(Lf)で区切られた三行
#($1 - $3)からなり、レコードの区切りが空行(LfLf)となっている。
#注:Unixの改行はLfだけです。

BEGIN { FS = "\n"; RS = "\n\n" }

#本処理、各フィールドを並べ替え、フィールド1(元の一行目)とフィ
#ールド2(元の二行目)の間にタブをメタ文字で挿入する。

{
  print $1 "\t" $2 "\t" $3
}

と書きalign.awk とでも名付けましょうね。これを外部ファイルの形式で
awkに与えて覚えさせ対象ファイルを食わせます。

# awk -f align.awk sample

標準出力は画面ですからファイルにリダイレクトさせておきましょう。

# awk -f align.awk sample > result

本当に正しく並べ変わったのか確かめるのにwcで行数を調べてみま
しょうか。

# wc sample 660 703 4699

wcは対象テキストファイルの行数、単語数、バイト数を教えてくれま
すからサンプルには660行あるのが分かります。置き換え後の結果は、
awk の出力をwcにパイプで渡すと、

# awk -f align.awk sample | wc 165 703 4534

となり行数660 が165に減り、バイト数も少しだけ減ったのが分か
ります。元々三行一組だったレコードが一つになり空行が省かれたの
で四分の一になった訳だから計算でも合ってます。まずは目出度し
目出度し。

Awkは駄目と言うのならperlにして見ましょう。Perlのパッケージには
下位のスクリプト言語、sedやawkで書いたスクリプトを変換する翻訳
コマンドが含まれています。これでperlのスクリプトに代えて見ましょう。

# a2p align.awk > align.pl

内容は

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
# this emulates #! processing on NIH machines.
# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
# process any FOO=bar switches

$FS = ' '; # set field separator
$, = ' '; # set output field separator
$\ = "\n"; # set output record separator

$FS = "\n";
$/ = "\n\n";

while (<>) {
chomp; # strip record separator
($Fld1,$Fld2,$Fld3) = split($FS, $_, 9999);
print $Fld1 . "\t" . $Fld2 . "\t" . $Fld3;
}


となり元のawkスクリプトに比べてフィールドのチェックに正規表現を使
っている位で処理の本質は変わりませんね。perlがed,sed,awk といっ
た行単位で処理するストリーム・エディターの流儀を継承しているの
が分かります。

W2KにActiveStateのActivePerl 5.6.1を入れていますがこちらにも
変換コマンドは含まれていますし、本ちゃんから作った上のスクリプトも
ちゃんと動いてくれます。

MSの世界でUnixを使って見たい方はActivePerlや、CygwinのUnix
Tools、(CygnusからCygwinに変わってたのですね。)やMS本家の
Unix Tools for windowsもありますし、その他移植版は色々ありま
すのでお試し下さい。

いりやさん、むたぐちさん重ねて御礼申し上げます。

それでは又


























ゥォン さん 2004年 03月 03日 00時 09分 20秒

参考意見のほうは、いいが、電力系統は、どうか。

はまざき さん 2004年 03月 02日 23時 15分 43秒

はじめまして。いつも勉強させていただいております。

今の現場で今度からASPの開発をする予定なので色々と試しているのですが、
私のクライアントではなぜかASPファイル内のVbscriptが解釈されません。

IISが動いている端末のあるフォルダにログインページ用のHTMLファイルと、
ログイン後のページ用のASPファイルを置いてあるのですが、アドレスバー
からHTMLを指定してログインを行っても、次に表示されるASPファイルの
スクリプトの部分が表示されません。同じことを別のクライアントで実行
するとちゃんと表示されます。ASPファイルの中身は単純に今日の日付を
表示するだけのものです。

IEの設定も全て標準に設定し、スクリプトの実行も有効にしているのですが。
IIS側でクライアントの監視なんかを行っているのでしょうか?どうかご教授
のほどを・・・。宜しくお願いします。

余談ですが、VBSファイルによるスクリプトの実行は可能です。別物ですけど。


さざなみ さん 2004年 03月 02日 13時 00分 23秒

さざなみです。
エクスプローラ上のアイコンは
shell.windows.document.Folder.FolderItems(n).Item
という感じでFolderItemを取得できますが、
デスクトップ上のアイコンをFolderItemと
して取得するには、どのようにすればいいでしょうか。

いりや さん 2004年 03月 01日 19時 10分 03秒

こちらこそ、また宜しくお願いします。

ただし さん 2004年 03月 01日 08時 51分 52秒

いりやさん、おはようございます。酔いも覚めました。

良書まで推薦して頂き感謝です。Amazonで元を調べて見たら五つ星が付
いてるし値段も手ごろですね。探して読んで見ましょう。

以前アメリカ流のプラグマ本、(American Pragmatism) D.カーネギー
を中心とした創元社シリーズを読んでいた時期もありました。
Positive Thinking でしたか、「人は自分が思ったようになれる。」
というフレーズを思い出しましたよ。

最近あちこちのフォーラムやML、ウインドウズ系に限らずUnix系で
も、とげとげしい遣り取りが目だって来ました。答える方は「礼儀
知らずだ、質問する前に何故努力しないのか、そんなことも知らな
いのか、Free Riderは出て行け」等々。

尋ねる方は「知っている者が知らない者に教えてくれても良いじゃな
いか、何お高くとまってるんだ、誰だってタコから始めたんじゃない
か」等々と切り返す。

良いパターンでも何か無味乾燥で枝葉のことばかり。コンマ一つで
解決、それではさようなら、お手軽過ぎて血が通ってません。

人間まだまだ感情に支配される生き物だから話がこじれるとお互いに
しこりを残しますね。私もあるウインドウズ系のフォーラムで予め答
えは分かっていたのですが、焦点をぼかして聞いて見たらぞんざいな
応答を受けた覚えがあります。まあこれは私が悪いが、それはそれな
りにそのフォーラムの性格が分かって良かったです。

何故こうもギスギスした世の中になって来たのか?評論家風に言え
ば「地球規模の構造改革局面に立ち至ってる」んでしょう。私流に
言うと、「牛丼を食べられなくなった鬱積のマグマがあちこちで噴
出して来た。」かな? 珍説たんとお笑い下され。

組織の力学は非常に微妙で難しいですね。自分がよい事をしている
と思っても他人は「浮き上がったピエロ」と見てるかも知れないし、
大人しくしていれば「孤立主義の難物」と見てるかも知れない。

幸い私の属している課も新人が二人も入って来て、どちらも楽観論
者でこれまでのムードを変えようと努めてくれているようです。

久方ぶりに血の通った対話をさせて頂き非常に有意義でした。これ
からも何卒宜しくお願い申し上げます。

はじめ 拝

いりや さん 2004年 02月 29日 23時 49分 26秒

ただしさん、

恥ずかしいことだなんてちっとも思っていませんよ。それよりもご自分できちんと問題
だと認識し解決の糸口を模索しようと、こうやって表にあらわされていることが素晴ら
しいことだとおもいます。たとえ内容がネガティブなもので簡単に解決できそうにない
ものであったとしても。

ところで、こういったチーム・ビルディングに関する良書を職場の先輩からすすめられ
て読んでいます。原書は 2000 年くらいの時期に出版されたものなのですでに 3 年以上
経過されたものです。邦題はやや読者の目を引くためかストレートでショッキングです
が原題はさほどでもありません。

この二冊の一言で言うならば、チーム・ビルディングの本です。一人ではなくチームと
して行動するための心得が非常にわかりやすく説かれています。コミュニケーションの
難しさとそれに処するための心構えについてもふれています。最初にビジネス・フィク
ションを紹介して、そこから導き出された教訓を次章でまとめている構成は、推理小説
を読んでいるようで、類書にありがちなかたいイメージを払拭しています。

なぜあなたのチームは力を出しきれないのか
パトリック・レンシオーニ著

(原題: The FOUR OBSESSIONS of an EXTRA ORDINARY EXECUTIVE)

あなたのチームは、機能してますか?
パトリック・レンシオーニ著

(原題: The FIVE DYSFUNCTIONS of a TEAM)

よろしければぜお手すきのときにぜひどうぞ。

ただし さん 2004年 02月 29日 22時 18分 58秒

済みません。二回送ってしまったようで。晩飯時に少し
飲んじゃったので手元が狂ってしまった。俺ももう廃人
プログラマーの仲間入りだな。。。

ただし さん 2004年 02月 29日 22時 18分 46秒

済みません。二回送ってしまったようで。晩飯時に少し
飲んじゃったので手元が狂ってしまった。俺ももう廃人
プログラマーの仲間入りだな。。。

ただし さん 2004年 02月 29日 22時 14分 03秒

いりやさん、本心からのコメントありがとうございました。

SunのSolarisがお得意のようですね。私はオープン・
ソース系のLinux、それも昔ながらのSlackware、とクリティカル
な用途にはマイナーなOpenBSDを使って来ました。

投稿してから身内の恥を晒してしまい非常に恥ずかしい事
をしたな、と反省してました。

>こういう負のスパイラルをとめて、誤ったレッテルを
>自分で取り除くにはエネルギーがすごく必要で30歳を
>越えてくるともうかなり難しいようです。それを邪魔
>する別な考え (プライド、自尊心、恥をかくのが嫌・
>みっともない、世間体、体面) が肥大しているからで
>す。

これはまったく自分にもあてはまることです。自分では
常に物事に固執しない、求められれば自分の知っている
事は全てオープンにする。自分のしている事は他人が見
て分かるようにマニュアル化しておく、を心がけ実践して来ましたが気が付いて見ると自分も
「井の中の蛙」に過ぎないのを痛感しております。

>でも、せっかく一緒に仕事をしているのも何かの縁ですし、
>知っている人が知らない人に伝えることも一つの親切では
>ないかな、とおもいます。

そうですね。話そうとするのですが相手が拒絶し「上司と話
します」で逃げてしまう。実はこの人物とは10年以上の知り
合いなんです。この人は当社が使っていたミニコンをメンテ
する下請け会社にいた人なんですがいつの間には当社に入っ
ていました。私がこの人の作業完了報告書にサインしていた
こともあるんです。

そんな訳だから私に対しての私怨なのかと思っていたのですが
どうもそうじゃない。他の人に対しても同じ姿勢で評判は良く
ありません。

しかしながら使う方からすれば言われたことはきちんとやるし
ミスも犯さない。犯していても自分じゃないと逃げるんでしょう。

>わたしも、ソフトウェア開発をともなうプロジェクトに従事し
>ており、日々このような>人間系からくる問題に取り組んでいます。>今もまさに困っています。

私もこの人物ももう若くない。意地の張り合いは止めるべきなんで
しょうがまあ周りも上司もその辺りを理解してくれているので私は
別段困らず私が新しいことを学んでいけば良いのだと割り切ってい
ます。

配置転換はMSの事をもっと深く理解する良い機会になったと思って
ます。身内の恥を晒してしまい、ご迷惑おかけして実に済みません
でした。

ただし さん 2004年 02月 29日 22時 14分 01秒

いりやさん、本心からのコメントありがとうございました。

SunのSolarisがお得意のようですね。私はオープン・
ソース系のLinux、それも昔ながらのSlackware、とクリティカル
な用途にはマイナーなOpenBSDを使って来ました。

投稿してから身内の恥を晒してしまい非常に恥ずかしい事
をしたな、と反省してました。

>こういう負のスパイラルをとめて、誤ったレッテルを
>自分で取り除くにはエネルギーがすごく必要で30歳を
>越えてくるともうかなり難しいようです。それを邪魔
>する別な考え (プライド、自尊心、恥をかくのが嫌・
>みっともない、世間体、体面) が肥大しているからで
>す。

これはまったく自分にもあてはまることです。自分では
常に物事に固執しない、求められれば自分の知っている
事は全てオープンにする。自分のしている事は他人が見
て分かるようにマニュアル化しておく、を心がけ実践して来ましたが気が付いて見ると自分も
「井の中の蛙」に過ぎないのを痛感しております。

>でも、せっかく一緒に仕事をしているのも何かの縁ですし、
>知っている人が知らない人に伝えることも一つの親切では
>ないかな、とおもいます。

そうですね。話そうとするのですが相手が拒絶し「上司と話
します」で逃げてしまう。実はこの人物とは10年以上の知り
合いなんです。この人は当社が使っていたミニコンをメンテ
する下請け会社にいた人なんですがいつの間には当社に入っ
ていました。私がこの人の作業完了報告書にサインしていた
こともあるんです。

そんな訳だから私に対しての私怨なのかと思っていたのですが
どうもそうじゃない。他の人に対しても同じ姿勢で評判は良く
ありません。

しかしながら使う方からすれば言われたことはきちんとやるし
ミスも犯さない。犯していても自分じゃないと逃げるんでしょう。

>わたしも、ソフトウェア開発をともなうプロジェクトに従事し
>ており、日々このような>人間系からくる問題に取り組んでいます。>今もまさに困っています。

私もこの人物ももう若くない。意地の張り合いは止めるべきなんで
しょうがまあ周りも上司もその辺りを理解してくれているので私は
別段困らず私が新しいことを学んでいけば良いのだと割り切ってい
ます。

配置転換はMSの事をもっと深く理解する良い機会になったと思って
ます。身内の恥を晒してしまい、ご迷惑おかけして実に済みません
でした。

ただし さん 2004年 02月 29日 22時 13分 57秒

いりやさん、本心からのコメントありがとうございました。

SunのSolarisがお得意のようですね。私はオープン・
ソース系のLinux、それも昔ながらのSlackware、とクリティカル
な用途にはマイナーなOpenBSDを使って来ました。

投稿してから身内の恥を晒してしまい非常に恥ずかしい事
をしたな、と反省してました。

>こういう負のスパイラルをとめて、誤ったレッテルを
>自分で取り除くにはエネルギーがすごく必要で30歳を
>越えてくるともうかなり難しいようです。それを邪魔
>する別な考え (プライド、自尊心、恥をかくのが嫌・
>みっともない、世間体、体面) が肥大しているからで
>す。

これはまったく自分にもあてはまることです。自分では
常に物事に固執しない、求められれば自分の知っている
事は全てオープンにする。自分のしている事は他人が見
て分かるようにマニュアル化しておく、を心がけ実践して来ましたが気が付いて見ると自分も
「井の中の蛙」に過ぎないのを痛感しております。

>でも、せっかく一緒に仕事をしているのも何かの縁ですし、
>知っている人が知らない人に伝えることも一つの親切では
>ないかな、とおもいます。

そうですね。話そうとするのですが相手が拒絶し「上司と話
します」で逃げてしまう。実はこの人物とは10年以上の知り
合いなんです。この人は当社が使っていたミニコンをメンテ
する下請け会社にいた人なんですがいつの間には当社に入っ
ていました。私がこの人の作業完了報告書にサインしていた
こともあるんです。

そんな訳だから私に対しての私怨なのかと思っていたのですが
どうもそうじゃない。他の人に対しても同じ姿勢で評判は良く
ありません。

しかしながら使う方からすれば言われたことはきちんとやるし
ミスも犯さない。犯していても自分じゃないと逃げるんでしょう。

>わたしも、ソフトウェア開発をともなうプロジェクトに従事し
>ており、日々このような>人間系からくる問題に取り組んでいます。>今もまさに困っています。

私もこの人物ももう若くない。意地の張り合いは止めるべきなんで
しょうがまあ周りも上司もその辺りを理解してくれているので私は
別段困らず私が新しいことを学んでいけば良いのだと割り切ってい
ます。

配置転換はMSの事をもっと深く理解する良い機会になったと思って
ます。身内の恥を晒してしまい、ご迷惑おかけして実に済みません
でした。

いりや さん 2004年 02月 29日 20時 57分 21秒

ちょい話がそれますが。

| この人「ほっておけばプログラマーは自分流に好き勝手し、何か起きても責任
| は絶対取らない」とのプログラマー性悪説に立っているようです。それにして
| はウインドウズ・コンポーネントの中身すら知らないんだけどな。。。

こういうレッテルは基本的には放っておけばよいと思っています。

もし、機会があれば、どんなことでそのシステムアドミニストレータの方が困ったこと
になったのか、責任が追求されたときにどんなことがおきたのか、お聞きするとよいと
思います。

もし、それが手痛い経験をされた上での話ならば、しめたもの、さらに突っ込んで、そ
れがなぜ起きたのか、聞いてみましょう。もしかしたらこのレッテルを彼自身が取り除
くきっかけがみつかるかもしれません。

わたしも、ソフトウェア開発をともなうプロジェクトに従事しており、日々このような
人間系からくる問題に取り組んでいます。今もまさに困っています。

そのときに分かったことですが、問題やトラブルに巻き込まれたときに受けた傷の痛み
はよく覚えているのですが、それもその一瞬だけ。解決した後にすぐにケロッと忘れて
しまう。忘れないで、なぜそれが起きたのか、突っ込んだ分析を自らおこなっている人
は稀有な存在です。私の周りでも十指にあまります、残念ながら。

大概の人は自分自身に突っ込まない。そしてしばらくして違う形でまったく同じ問題や
トラブルを起こしてしまう。そうしているうちに、ふと気づいてみると、レッテルをはっ
て「自分じゃない」と安心している自分がいる。今回の性悪説のお話はこんな感じでプ
ログラマに貼ったレッテルではないでしょうか。

こういう負のスパイラルをとめて、誤ったレッテルを自分で取り除くにはエネルギーが
すごく必要で 30 歳を越えてくるともうかなり難しいようです。それを邪魔する別な考
え (プライド、自尊心、恥をかくのが嫌・みっともない、世間体、体面) が肥大してい
るからです。

でも、せっかく一緒に仕事をしているのも何かの縁ですし、知っている人が知らない人
に伝えることも一つの親切ではないかな、とおもいます。

ちょっと時間を割いて声をかけてみられてはとおもい、すこし脱線しました。

いりや さん 2004年 02月 29日 20時 18分 48秒

ただしさん、

| # awk -F,"\t" {print ($1, $2, $3)} 置換前 > 置換後

わたしだったらこんな感じ。たしかに One-liner レベルで書いてすぐ捨てる類のものだ
とはおもいます。

| www2[Sun]$ cat input.txt
| AAA
| BBB
| CCC
|
| DDD
| EEE
| FFF
|
| GGG
| HHH
| III
| www2[Sun]$ awk -v RS="\n\n" -v FS="\n" '{ for (i = 1; i < NF; i++) printf("%s\t", $i); printf("%s\n", $NF) }' input.txt
| AAA BBB CCC
| DDD EEE FFF
| GGG HHH III
| www2[Sun]$

ところで。ところで。

ぜひ、直接システムアドミニストレータの方にお会いして「なぜ MS の純正アプリ、コ
ンポーネント、コマンド以外は使ってはいけないのですか?」とお聞きしたいですね。

もっとも、それはできない相談ですし、いただいたご説明だけで自分が 100% 理解でき
る話とも思っていませんので、少しだけ書きます。

「Web サーバーには業務の大きなアプリが動いてる、そんな得体の知れないもの使って
もし何か起きたらどうするのか」

こちらは、上記の使用禁止という対処とは全く別な話で、リスク (潜在的問題) として、
よく同僚とも議論しています。リスクに対する臨み方については唯一の解答などあるは
ずもありませんから、システムアドミニストレータの方と議論して詰めて、リスクを評
価して適切な緩和策をうってほしい、とおもいます。結果として、上記の使用禁止令が
リスクへの対処として発令するに足るものだと判明すれば、それはそれで一つの判断だ
と思います。

ぜひ、現状の改善にエネルギーを費やしていただき、(若い) 第二の被害者を生まない環
境にしていただければと思っています。

ただし さん 2004年 02月 29日 18時 37分 57秒

いりやさん、むたぐちさん、早速のご回答ありがとうございました。

うーん、ウインドウズではこんな簡単な事が思ったより複雑な事
をしないと出来ないのですね。

実は私元々Unix畑でawkを使えば簡単に処理出来るのは分かっていました。
言葉足らずですみませんでした。この程度なら別段スクリプトを書かずと
も一行で出来ますよね。フィールド・セパレーターをタブに代えるだけ。

# awk -F,"\t" {print ($1, $2, $3)} 置換前 > 置換後

awkにはFS:フィールド・セパレーターとRS:レコード・セパレーターの概念が
ありますからこれを代えればいかようにも出力出来ます。

いりやさんご指摘の「現場の注文」には私も苦労して来ましたが、その都度、
grep, sed, awk, perl, sort等をパイプで繋いで解決して来ました。

しかしながら私自身ではどうしようもない事件が起きて、得意技を封じられて
しまったのです。業績左前で部門縮小、配置転換です。

移った先でWebアプリの開発を任されたのですが、ここに石頭シスアドがいてMS
の純正アプリ、コンポーネント、コマンド以外は絶対に使わせてくれません。

この人「ほっておけばプログラマーは自分流に好き勝手し、何か起きても責任
は絶対取らない」とのプログラマー性悪説に立っているようです。それにして
はウインドウズ・コンポーネントの中身すら知らないんだけどな。。。

ご承知の通り、awkは開発者カーニハン先生のawk95.exeやSygnus Win32キッ
ト、MS自身最近無償でUnix Toolsを公開しましたね。Unix系コマンドはもう
立派にMSの世界でも公民権を得ていると思うのですが。。。

上司は良いというのですが、その人物は「Webサーバーには業務の大きなアプリ
が動いてる、そんな得体の知れないもの使ってもし何か起きたらどうするのか」
と脅かすので上の立場とすれば「現場の注文」を尊重する訳で私が泣きを見る。
苦笑

逆差別ですね。まあ私は最初から「負け組み」なので喧嘩しても始まらないの
で何とかMS流儀で解決出来ないかと思いご相談申し上げました。

ちなみにやりたい事は、もう私のテスト環境では実現出来ています、ある所の
HTMLを取ってきてその中から特定の部分を抽出しこちらのHTMLの部分と置き換
えて表示するものです。

各パートに分けてスクリプトを書き各々 at コマンドで自動実行するようにし
ています。置換の部分だけはsed, awkのバッチファイルにして後はVBスクリプ
トにしています。

教えて頂いたいずれの方法でも別に正規表現は使わなくとも良いのですね。
それにしても Replaceを複数回使うとは考えもしませんでした。

試してみます。本当にありがとうございました。

取り急ぎ御礼まで。




管理人むたぐち さん 2004年 02月 29日 16時 05分 30秒

To: ただし さん

いりやさんとは正反対のアプローチになりますが、
入力データのフォーマットが絶対的に保証されてるなら、
私だったらこうやって逃げます。

sOutput=Replace(Replace(Replace(sInput,vbCrLf & vbCrLf,Chr(0)),vbCrLf,vbTab),Chr(0),vbCrLf)

あるいは

For Each s In Split(sInput,vbCrLf & vbCrLf)
sOutput = sOutput & Replace(s,vbCRLf,vbTab) & vbCrLf
Next

いりや さん 2004年 02月 29日 15時 36分 34秒

| VBスクリプトの正規表現の件は、わたしはよく分からないのですが、、この手のファイ
| ル書式の変換という課題をかんがえるとき、入力データの書式に例外が 100% ない場合
| が多いので、そういう例外をプログラマが容易に追加できるようになっていることが望
| ましいです。

VBスクリプトの正規表現の件は、わたしはよく分からないのですが、、この手のファイ
ル書式の変換という課題をかんがえるとき、入力データの書式に例外が 100% ない場合
などまずありませんから、そういう例外をプログラマが容易に追加できるようになって
いることが望ましいです。

が正しかった。お詫びして訂正します。


いりや さん 2004年 02月 29日 15時 13分 57秒

むたぐちさん、

> これからは容量を気にせず、いろいろできそうです。

いそぎ対応が必要なくなってよかったですね。。

いりや さん 2004年 02月 29日 15時 11分 54秒

ただしさん、

| これをSQLにインポートするために
|
| AAA(Tab)BBB(Tab)CCC(CrLf)
| DDD(Tab)EEE(Tab)FFF(CrLf)
|
| の形にしたいのですが、単純に考えると復帰・改行をタブ
| 文字に置換すれば良いのですが上手く行きません。

VBスクリプトの正規表現の件は、わたしはよく分からないのですが、、この手のファイ
ル書式の変換という課題をかんがえるとき、入力データの書式に例外が 100% ない場合
が多いので、そういう例外をプログラマが容易に追加できるようになっていることが望
ましいです。

例えば、

・「1行あたり1カラム」という前提が崩れる (1 行あたり N カラム)
・「空行がレコードを示す」ことだが、空行が 2 行 3 行と続く
・「入力カラムデータにカラム区切り子 (tab) は含まれない」という前提が崩れる
・後になって「入力データで # で始まる行はコメントとして無視」してくれといわれた
・後になって「印刷形式で CSV もサポートするようデリミタを変更可能に」してくれと
 いわれた
・後になってインポートする先のデータベースのスキーマが変更となって「その変更し
 たスキーマに合致するよう、カラムを適当に変更してインポートファイルを作成して
 くれ」といわれた

といったような話です。現場では日常茶飯事です。

このような話をすべて正規表現のパタンマッチだけで考えると実はけっこうたいへんで
す。

かわりに、次のようなフィルタ処理の適用を検討すると、すこしばかり見通しがよくな
ります。これは Awk で数行で書けるフィルタを JScript で書いた例です。(だから数行
という訳にはちょっといかない...) 詳しくはコメントをご覧ください。

では、そもそも、フィルタ処理とは何ぞや? ですが、こちらについては「Awk とは」と
いったキーワードを www.google.com に与えると、解説サイトがヒットします。

ご参考になれば幸いです。

いりや

[ 実行の仕方 ]

var readStream = file→readStream(filepath→file('.\\フィルタ入力.txt'));
var writeStream = file→writeStream(createFile('.\\フィルタ出力.txt'));

入力ファイル (これはすでに用意されているはず) と印刷結果を格納する出力ファイル
のパスを指定します。

またスクリプトを filter.js というファイル名で保存します。

filter.js ファイルをダブルクリックすると処理を終えます。

[ WSH/JScript ソースコード ]

var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');

var readStream = file→readStream(filepath→file('.\\フィルタ入力.txt'));
var writeStream = file→writeStream(createFile('.\\フィルタ出力.txt'));
    
WScript.echo('フィルタ処理をはじめます');

process(readStream, writeStream, filter1);
//process(readStream, writeStream, filter2);

WScript.echo('フィルタ処理が終わりました');

// processs : フィルタ処理のエントリポイント
//
// ・入出力 (readStream, writeStream)に ITextStream インターフェイスを
//  サポートするオブジェクトへのリファレンスを与えます。 File オブジェ
//  クトの openAsTextStream() メソッドでそのリファレンスを得ます。
// ・フィルタ (filter) は以下の構造をもつ関数オブジェクトとして与えます。
//      function filter(readStream, writeStream)
//  サンプルとして filter1, filter2 を添付します。

function process(readStream, writeStream, filter) {
    try {
        filter(readStream, writeStream);
    } finally {
        readStream.close();
    }
}

// filter1 : 基本的なフィルタ関数
//
// ・各行にカラムが一個ならんでいるものをサポートする
// ・空行を発見したらそれまでのカラムを1行に印刷する
// ・カラムデータは \t で区切られる
// ・空行が 2 つ以上ある場合は、カラムデータのないレコードとして
//  解釈して印刷しない
//
// メモ
//
// ・stringArray[] にカラムデータが格納されています
// ・印刷形式をカスタマイズするには printBlock() 関数オブジェクト
//  を修正します
// ・デリミタを変更するには join() メソッドの引数を変更すればよい
//  です。たとえば CSV 形式ならば join(',') とします

function filter1(readStream, writeStream) {
    var printBlock = function () {
        if (stringArray.length != 0) {
            writeStream.writeLine(stringArray.join('\t'));
            stringArray = new Array();
        }
    }
    var stringArray = new Array();
    while (!readStream.atEndOfStream) {
        var aString = readStream.readLine();
        if (/^$/.test(aString))
            printBlock();
        else
            stringArray.push(aString);
    }
    printBlock();
}

// filter2 : filter1 で提供する機能に、次の機能を追加します
//
// ・各行にカラムデータが複数個ならんでいるときもサポートする
// ・カラムデータのセパレータは / +/ (1 個以上の半角スペース) とする
// ・カラムデータは \t で区切られて印刷される

function filter2(readStream, writeStream) {
    var printBlock = function () {
        if (stringArray.length != 0) {
            writeStream.writeLine(stringArray.join('\t'));
            stringArray = new Array();
        }
    }
    var stringArray = new Array();
    while (!readStream.atEndOfStream) {
        var aString = readStream.readLine();
        if (/^$/.test(aString))
            printBlock();
        else {
            var tempArray = aString.split(/ +/);
            for (var i = 0; i < tempArray.length; i++)
                stringArray.push(tempArray[i]);
        }
    }
    printBlock();
}

function filepath→file(filepath) {
    return FileSystemObject.fileExists(filepath) ? FileSystemObject.getFile(filepath) : null;
}

function file→readStream(file) {
    var ForReading = 1;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForReading, TristateUseDefault);
}

function file→writeStream(file) {
    var ForWriting = 2;
    var TristateUseDefault = -2;
    return file.openAsTextStream(ForWriting, TristateUseDefault);
}

function createFile(filepath) {
    if (!FileSystemObject.fileExists(filepath))
        FileSystemObject.createTextFile(filepath, true); // 2nd arg : overwrite
    return FileSystemObject.getFile(filepath);
}

ただし さん (tokano@kt4.ctktv.ne.jp) 2004年 02月 29日 12時 38分 04秒

VBスクリプトの正規表現でお尋ねします。

メタ文字をメタ文字に置換するのは可能でしょうか?

サンプルは、

AAA(CrLf)
BBB(CrLf)
CCC(CrLf)
(CrLf)
DDD(CrLf)
EEE(CrLf)
FFF(CrLf)
(CrLf)

となっていてフィールドの行末に復帰・改行があり
レコードの区切りも復帰・改行となっています。

これをSQLにインポートするために

AAA(Tab)BBB(Tab)CCC(CrLf)
DDD(Tab)EEE(Tab)FFF(CrLf)

の形にしたいのですが、単純に考えると復帰・改行をタブ
文字に置換すれば良いのですが上手く行きません。

公式とおりに、まず置換対象ファイルと結果を書き込む
ファイル、置換前、置換後、をObjectで作り、開いてお
き,

Set objRe = New RegExp
With objRe
.IgnoreCase=False
.Global=True
.MultiLine=True
.Pattern="\r\n"

置換後=objRE.Replace(置換前, "???")

End with
Set objRe=Nothing

としていますが、置換文字"???"をタブのメタ文字や16進
にしても単なる「文字」として置き換わるだけで「タブ文字」と
はなりません。

.MultiLine=True(False)のオプションでレコードの区切りを
復帰・改行から変えられるとありますが、効き目がありません。

.Pattern="(\r\n){1}" として一回だけマッチさせようとして
も駄目です。

このような場合はどのような方法を使えば良いのでしょうか?
宜しくお願い致します。


管理人むたぐち さん 2004年 02月 29日 11時 39分 20秒

http://home.hi-ho.ne.jp/support/service/rental-web/index.html

> お知らせ
>
> 2004年3月より、個人会員の方は基本Web容量10MBから50Mに容量アップ。
> 無料でご利用可能となります。

ということで、移転しなくても良くなりました。
まもなく過去記事数が100になるので、XREAに移行しようと思ってた瞬間の
吉報と言いますか。

これからは容量を気にせず、いろいろできそうです。

放蕩息子 さん 2004年 02月 27日 17時 05分 21秒

魔界の仮面弁士さん、ありがとうごうざいます。

早速試して見ました....下命の環境では、サポートされていないようです。
Win32_ProcessクラスのCommandLineプロパティは、Windows XPからの様でしたので、別途、方法を模索致します。
(Windows XPでは、動作致しました。)

ありがとうごうざいました。

魔界の仮面弁士 さん 2004年 02月 26日 13時 13分 05秒

> →WMIは使用したことがない為、苦戦しそうです。
あ、あれ? 使用された事が無い?

そうしますと、最初の質問にあった、
| Terminate
| … すべてが停止されてしまう。
| ExecutablePath
| … すべてc:\Winnt\system32\wscript.exeとなり、判別できない。
というのは、何の事を指していたのでしょうか?


> WMIのWin32_Processクラスで検討してみなす。
頑張って、みなしてください。
一応、サンプルを書いてみます。(言語は、VBScriptで良いですよね?)

'========================
Option Explicit
Dim Proc, WQL, Msg, ret

WQL = "SELECT * FROM Win32_Process WHERE Name='wscript.exe'"
Msg = "以下のプロセスを停止します。よろしいですか?" & vbCrLf & vbCrLf
For Each Proc In GetObject("winmgmts:").ExecQuery(WQL)

ret = MsgBox(Msg & Proc.CommandLine, vbYesNoCancel Or vbQuestion, "WScript.exe強制停止")

If ret = vbYes Then

On Error Resume Next
Proc.Terminate 0
On Error GoTo 0

ElseIf ret = vbCancel Then

Exit For

End If

Next

放蕩息子 さん 2004年 02月 26日 11時 32分 11秒

魔界の仮面弁士さん、いりやさん ありがとうございます。

WMIのWin32_Processクラスで検討してみなす。
→WMIは使用したことがない為、苦戦しそうです。



いりや さん 2004年 02月 25日 18時 51分 27秒

放蕩息子さん、魔界の仮面弁士さん、

あいや、中途半端なスクリプトをお出ししてすみません。

ちょっと terminate() の機能確認でパパッと書いたものでした
ものでしたので放蕩息子さんの期待するものとは違うものでした。

まだ初見エラーと格闘しています。(^^; > 魔界の仮面弁士さん

魔界の仮面弁士 さん 2004年 02月 25日 15時 23分 14秒

> A.vbs(Windows起動時に起動) 及び B.vbs(C.vbs起動する前) が起動中で、
> C.vbs にてA.vbsのみを強制的に停止したいと考えております。

であれば、先に回答した、WMIのWin32_Processクラスによる
「CommandLine プロパティ」や 「CreationDate プロパティ」が
使えると思います。

CreationDateは、そのプロセスが起動された時刻を返し、
CommandLineは、「C:\〜\WScript.exe "A.vbs"」のような文字列を返します。

放蕩息子 さん 2004年 02月 25日 14時 52分 24秒

魔界の仮面弁士さん、いりやさん ご回答ありがとうございました。

いりやさんのおっしゃるとおり、下命の環境でも同様にエラーが発生し、
タスクマネージャ上にwscript.exeが残っておりました。
 環境:Windows2000,WBS5.6
また、ご提示頂いたmonitor.jsは、monitor.jsからa.js,b.jsを起動し
停止する様です。申し訳ありません。初心者なもので情報が不足しておりました。

 A.vbs(Windows起動時に起動) 及び B.vbs(C.vbs起動する前) が起動中で、
 C.vbs にてA.vbsのみを強制的に停止したいと考えております。

ご助言の程、宜しくお願い致します。

魔界の仮面弁士 さん 2004年 02月 25日 11時 09分 23秒

》 いりや さん
> わたしはてっきり wshScriptExec オブジェクトのことかと思っていました。。
wshScriptExecにも『Terminal』メソッドはありますけれど、『ExecutablePath』は無いので、
私は、Win32_Process の事かな、と予想しました。(^^;

# それ以外で、"ExecutablePath" を持つオブジェクトというと、.NET Framework の
# System.Windows.Forms.Application クラスなどがありますけど、WSHで、
# わざわざ JScript.NET等を呼び出しているという事も無いでしょうしね。


> エラー「ウィンドウハンドルが無効です。」と。なんでやねん。。
うーむ。何故でしょうね。
投稿された monitor.js を試してみましたが、問題なく Terminate されました。

いりや さん 2004年 02月 25日 10時 30分 10秒

これ実行するときエラー後に B.js がプロセスとして残りますので
タスクマネージャで削除ください。(画面では wscript.exe という
名前で表示されます)

いりや さん 2004年 02月 25日 10時 28分 30秒

こんなスクリプトです。

[ Monitor.js ]

var Shell = new ActiveXObject('WScript.Shell');

var wshScriptArray = new Array();
createProcess();
WScript.sleep(3 * 1000); // Wait 3 secs.
WScript.sleep(3 * 1000); // Wait 3 secs.
terminateProcessA(); // ここでエラーがでる
terminateProcessB();
WScript.echo('Finished.');

function createProcess() {
    wshScriptArray.push(Shell.exec('wscript.exe .\\A.js')); // wshScriptArray[0] が .\A.js
    wshScriptArray.push(Shell.exec('wscript.exe .\\B.js')); // wshScriptArray[1] が .\B.js
}

function terminateProcessA() {
    var wshScriptExec = wshScriptArray[0];
    wshScriptExec.terminate();
}

function terminateProcessB() {
    var wshScriptExec = wshScriptArray[1];
    wshScriptExec.terminate();
}

[ A.js, B.js ]

while (true) {
    WScript.sleep(1);
}

いりや さん 2004年 02月 25日 10時 27分 00秒

魔界の仮面弁士さん、放蕩息子さん、

わたしはてっきり wshScriptExec オブジェクトのことかと思っていまし
た。。で、ためしに terminate() メソッドをキックしたらはじめてみる
エラー「ウィンドウハンドルが無効です。」と。なんでやねん。。

30w さん 2004年 02月 25日 01時 24分 57秒

 InternetExplorer をスクリプトで操作して、
あるexeファイルのダウンロードが何秒かかるかを
計測するには、どうすればいいのでしょうか?
「DownloadComplete」イベントを使うのかと思って
試してみたのですが、以下のようなワードファイルでの
読み込みでしか反応してくれませんでした。

 ご存知の方がいらっしゃいましたら、よろしくお願いします。


Dim TM
Set IE = WScript.CreateObject("InternetExplorer.Application", "oIE_")
IE.Visible = TRUE
IE.Navigate "C:\test.doc"
Set IE = Nothing

Sub oIE_DownloadBegin()
TM = Now
End Sub

Sub oIE_DownloadComplete()
msgbox TM & " 〜 " & Now
End Sub

魔界の仮面弁士 さん 2004年 02月 24日 22時 39分 48秒

》放蕩息子 さん
> Terminate
> … すべてが停止されてしまう。
> ExecutablePath
> … すべてc:\Winnt\system32\wscript.exeとなり、

WMIのWin32_Processクラスを試されているのですよね。もしそうなら、
CommandLine プロパティや CreationDate プロパティが使えるかもしれません。

いりや さん 2004年 02月 24日 18時 34分 29秒

yoko さん、

ちなみに SMTP サーバ側のログは確認されましたか??
クライアント側からそもそも SMTP メッセージが送られていない
のか、送られているけれども SMTP メッセージをきちんと SMTP
サーバが処理できないのか。どうなのでしょうね。。

yoko さん (toyama@simplenet.co.jp) 2004年 02月 24日 16時 02分 02秒

ASPでメールを送ったが、なかなか相手には飛んでない、
二つの方法をやってみた、SMTP,メールアドレスなどには問題ないはずです。
その原因はどこにあるのですか?

1.
Set cdoMail = Server.CreateObject("CDO.Message")
cdoMail.MimeFormatted = True
cdoMail.From = sFrom
cdoMail.To = Replace(sTo, vbTab, ",")
cdoMail.Subject = sSubject
cdoMail.TextBody = sBody
cdoMail.Send
2.
file=""
Set bsp = Server.CreateObject("basp21")
ssTo = Replace(sTo, vbTab, ",")
ret = bsp.SendMail(sMailServer,ssTo,sFrom,sSubject,sBody,file)

岩本 洋子 さん (y.iwamoto@hokusho-gr.co.jp) 2004年 02月 24日 14時 34分 27秒

最近windows95〜xpに機種変更しました。中身はそのままコピーして使用していますが、いろんな不備があり困っています。
たとえばグリーティングカードを送ろうとしたときにサーバーが見つかりません。DNSエラーですとなります。ぜんぜんわからないのですが、どうしたらよいでしょうか?教えてください。

放蕩息子 さん (noriot@sepia.ocn.ne.jp) 2004年 02月 24日 14時 10分 55秒

初めて投稿させて頂きます。
VBSプログラム作成で格闘中で、こちらの発見致しました。
以下を実現できないか苦戦中であり、ご助言頂ければ幸いです。

A.vbs 及び B.vbs が実行中で、C.vbs にてA.vbsのみを
強制的に停止できないでしょうか。

過去のログを拝見させて頂き、多少検討致しましたが、中々
実現出来ておりません。
Terminate
… すべてが停止されてしまう。
ExecutablePath
… すべてc:\Winnt\system32\wscript.exeとなり、
判別できない。ここでA.vbs,B.vbsと判別できないでしょうか。

宜しくお願い致します。

いりや さん 2004年 02月 24日 11時 37分 14秒

yoko さん、

Dynamic HTML Object Model の focus() メソッドを使います。

たぶん google (http://www.google.co.jp) などが格好のお手本で
しょう。ソースを開いて、body オブジェクトの onLoad アクショ
ンの sf() 関数をみてみてください。(以下引用)

    function sf(){document.f.q.focus();}


yoko さん (toyama@simplenet.co.jp) 2004年 02月 24日 11時 13分 11秒

前もここで大変お世話になりました、ありがとうございます。
簡単な問題ですかもしれないです、あるEDITBOXにカソールを移動する方法を知りたいです。
ASPをやってます、もしかして、HTMLにもこういう手段あると思います。
よろしくお願いいたします。

黒酢飴 さん 2004年 02月 23日 19時 24分 50秒

初めて投稿させていただきます。
最近になってWSHのことを知り、使用する(専らWebよりもコマンドとしてですが)ことになったのですが、なにぶん初心者で行き詰っております。
以下のような感じのことを行いたいのですが、package内で別のjobを呼び出すことはできないのでしょうか?
やりたいことはpackage内の全てのjob(job1を実行することにより、全てのjobを実行)することも個別のjob(job2及びjob3)を実行することもしたいのです。
最悪、「If job2の処理は異常終了? = True Then」のように呼び出したjobの実行結果は分からなくても結構です。(ファイル出力などで対応します)
何かうまい方法をご存知でしたらお教えいただきたいのですが。

<package>
<job id="job1">
<script language="VBScript">
job2を実行
If job2の処理は異常終了? = True Then
WScript.Quit
End If

job3を実行
</script>
</job>
<job id="job2">
<script language="VBScript">

job2の処理

</script>
</job>
<job id="job3">
<script language="VBScript">

job3の処理

</script>
</job>
</package>

初心です さん 2004年 02月 23日 16時 59分 56秒

html中で、wshを実行させるにあたり、元々 wsh中にsub−endifが有ったのですが、 vbscriptの呼び出し指定でsubを2つ記述することになります。
その時、subが2つあるので、上手く動きません。 どのようにしたら良いのでしょうか?

サンプル です。

<html>
<head>

<script language=VBScript>
<!--
Sub Btn_Click
myfolder = "\\acf"
newfolder = "\\joblog"

dim newfile
dim sWord2
dim textsize
dim tommorow, sWord, textdate, sWord3 , datex, sWord4
dim newtext
dim target
dim allcnt, delcnt

set fs = createobject("scripting.filesystemobject")
set objfolder = fs.getfolder(myfolder)
set newfile = Fs.CreateTextFile("ID削除前リスト.txt",True)

tommorow = dateadd( "d", -10, now() )
sWord = ( right(year(tommorow),2) & "/" & right(100 + month(tommorow),2) & "/" & right(100 + day(tommorow),2) )
sWord4 = ( right(year(now),2) & "/" & right(100 + month(now),2) & "/" & right(100 + day(now),2) )

newtext = "今日は、" & sWord4 & "です。10日前の、" & sWord & "以前に作成された空ファイル一覧です。"
newfile.WriteLine(newtext)
newtext = "▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ "
newfile.WriteLine(newtext)


call checkfile(objfolder)
sub checkfile(objfolder)
for each objfile in objfolder.files
allcnt=allcnt+1

'@ #付で、ヘッダのみで、作成日が10日前のファイルを選択
sWord2 = "#"
If InStr(objfile.name,sWord2)<>0 Then 'その行にもし#があったら

textsize = objfile.size
if int(textsize) = 1616 or int(textsize) = 2424 or int(textsize) = 780 then

textdate = objfile.dateCreated
sWord3 = ( right(year(textdate),2) & "/" & right(100 + month(textdate),2) & "/" & right(100 + day(textdate),2) )
if sWord3 <= sWord then

delcnt=delcnt+1


newtext = objfile.path & " " & objfile.dateCreated & " " & objfile.size
newfile.WriteLine(newtext)



end if
end if
end if

next

for each objsubfolder in objfolder.subfolders
call checkfile(objsubfolder)

next

end sub

newtext = "▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ ▲ ▽ "
newfile.WriteLine(newtext)
newtext = allcnt & "中 空ファイルは、" & delcnt & "でした。"
newfile.WriteLine(newtext)

MsgBox "ID削除前リスト.txtに出力しました。"
WScript.Echo(allcnt & " 中 空ファイルは、" & delcnt & "でした。")



End Sub
-->
</script>



</head>
<body>
<h3>HTML利用テスト</h3>
<input type=text size=40 name=TextField>
<input type=button value=CLICK name=Btn OnClick=Btn_Click>
</body></html>



 


まさる さん 2004年 02月 23日 10時 30分 38秒

最近WSHを仕事の都合で使うようになり
こちらを拝見させていただいております。

会社の端末移設に従って
ネットワークの設定が変わるため、VBSを使ってネットワーク設定を
変更するスクリプトを組んでいるのですが
プリンタ設定の変更について困っています。

部門が間違って使用しないように
移設前のネットワークプリンタを削除して新しいプリンタを作ると言う風にしたいのですが
ローカルプリンターもいくつか設定されているため
3つ以上設定されている中から該当するものだけ削除して
新規に設定すると言う方法をとりたいのです

CSVファイルから端末名・旧プリンタ設定(プリンタ名・ポート名など)。新プリンタ設定などを書き込み、そこから読み込むようにする位しか思いつかないのですが
スクリプト作成のとっかかりになるようなヒントだけでもいただければと思っています。

よろしければ是非お願いします。

いりや さん 2004年 02月 21日 08時 39分 45秒

coopie さん、

> <data key="strTestDir">C:\\test</data>

<data key="strTestDir">C:\test</data>

とやってみるとどうでしょうか。こちら (WinXP Pro SP1 + IE6.0 SP1)


<?xml version="1.0" encoding="Shift_JIS"?>
<doc>
<page type="1">
<data key="strTestDir">D:\Program Files\uwsc\scripts</data>
</page>
</doc>

という半角スペースあり、\ のエスケープなしでフォルダのパスを
表現してテストしましたがうまくいきました。あと実際に作成され
たショートカットのプロパティーを開いてリンク先のフィールドを
みてみるとよいかも。

coopie さん 2004年 02月 21日 05時 28分 57秒

以前、createFolderでお世話になりましたcoopieです。

XMLを使いはじめたのですが、ちょっと困ったことがありますので、
質問させていただきます。長くなりますが、お許し下さい。

XMLから読み込んだパスのフォルダのショートカットを作ると、
フォルダとしての関連付けがされません。
直接、パスを指定した場合や、ファイルのショートカットの場合は問題がありませんでした。
理由とか、回避法がありましたら、教えて下さい。
以下、JScriptとxmlデータです。
test.js
---------
objWshShell = WScript.CreateObject("WScript.Shell");
objFS = WScript.CreateObject("Scripting.FileSystemObject");

manager = new XmlManager(objFS.GetAbsolutePathName("test.xml"));
manager.setPage(0);

//strTestDir = "C:\\Test";
strTestDir = manager.getValue("strTestDir");

makeShortcut( "D:\\test.lnk",strTestDir );

function makeShortcut(sPath, sTarget) {
var objShortcut;
objShortcut = objWshShell.CreateShortcut(sPath);
objShortcut.TargetPath = sTarget;
objShortcut.Save();
}

function XmlManager(name) {
this.dom = WScript.CreateObject("MSXML2.DOMDocument");
this.dom.load(name);
this.pagelist = this.dom.getElementsByTagName("page");
this.setPage = setPage;
this.getValue = getValue;
}

function setPage(pageNo) {
this.page = this.pagelist[pageNo];
}

function getValue(key) {
var nodelist;

nodelist = this.page.selectNodes("data[@key='" + key + "']");
if (!nodelist.length) return "";
return nodelist[0].text;
}
---------
test.xml
-----------
<?xml version="1.0" encoding="Shift_JIS"?>
<doc>
<page type="1">
<data key="strTestDir">C:\\test</data>
</page>
</doc>
-----------

とこ さん 2004年 02月 21日 00時 58分 10秒

魔界の仮面弁士さん
ありがとうございました。
無事、テストできました。
あとは、バイナリ(添付ファイル)のテストが残っておりますが
この調子でがんばってみます。

魔界の仮面弁士 さん 2004年 02月 21日 00時 03分 27秒

MSXMLを使う場合は、セキュリティ上の理由から、最新版を入手しておいて下さい。
http://www.microsoft.com/downloads/details.aspx?FamilyID=3144b72b-b4f2-46da-b4b6-c5d7485f2b42&DisplayLang=ja

> うまくいかないのですが、
失礼しました。
HTML FORMからのPOSTと同様に処理したい場合は、送信前に
  X.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
を入れておいて下さい。

# 普段、サーバ側で、HTTP要求ボディをストリームとして
# 直接取得していたので、すっかり忘れてました。
## ……って、これでも駄目だったらどうしよう(汗)


> これのドキュメントってどこにあるのでしょうか?
上記に示したURLを開くと、ページの右側に[MSXML 4.0 SDK ドキュメント]へのリンクがあります。


> X.Open "POST", "http://〜〜/xxx?name=hoge", False
これだと、QueryString として取得されてしまうかも。

とこ さん 2004年 02月 20日 20時 04分 01秒

魔界の仮面弁士 さん

Set X = CreateObject("MSXML2.XMLHTTP")
X.Open "POST", "http://〜〜/", False
X.send "name=hoge"
が、うまくいかないのですが、これのドキュメントってどこにあるのでしょうか?

ちなみに、
X.send "name=hoge"
ではなく、
X.Open "POST", "http://〜〜/xxx?name=hoge", False
だと、うまくいきました。

魔界の仮面弁士 さん 2004年 02月 20日 15時 43分 11秒

ちなみに、XMLHTTPを使ってPOSTする場合は、こんな感じです。

Set X = CreateObject("MSXML2.XMLHTTP")
X.Open "POST", "http://〜〜/", False
X.send "name=hoge"

Return