新米MCP さん 2006年 03月 12日 23時 22分 36秒

>ぽち さん 2006年 03月 12日 19時 46分 34秒

var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("ショートカットのパス");

パスの\はエスケープしなきゃいけないので、\\に置き換えて。
"は\"に置き換えます。

こんな最初でつまずいてる状態なんだったら、何か本でも買ってきてやった方がいいですよ。

ぽち さん 2006年 03月 12日 19時 46分 34秒

JSを使ってWSHを書いています。(初)
JSから、あるショートカットを実行したいのですがどうしたらよいのでしょうか?
(因みに、そのショートカットはあるexeを引数付きで起動するものです)

まろ さん 2006年 03月 12日 18時 41分 15秒

To:むたぐち さん

コメントありがとうございました。早速試しました。

>のように、command.com /c でウィンドウを閉じるようにしてやれば
>いけると思います。(Win98で動作確認)

仮想ドライブは出来たのですが、実行時の画面が真っ黒になり時間もバッチ
ファイルよりもかかるようです。

難しいものですね。

管理人むたぐち さん 2006年 03月 12日 15時 50分 01秒

To: まろ さん
> WIN2000では問題なく仮想ドライブが設定出来るのですが、WIN95では最初の一行
> 目しか実行されません。

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "command.com /c subst.exe P: C:\Mail\修正P",1,True
WshShell.Run "command.com /c subst.exe R: C:\Mail\受信箱",1,True

のように、command.com /c でウィンドウを閉じるようにしてやれば
いけると思います。(Win98で動作確認)
なお、command.com、subst.exe、C:\Mail\*いずれかのパスにスペースが
含まれている場合は""で適切にくくってやる必要があります。


To: AKA さん 2006年 03月 11日 22時 48分 03秒

0バイトのファイル削除しておきました〜。

AKA さん 2006年 03月 11日 22時 48分 03秒

ごめんなさい!
ファイルが壊れている原因は、アップするファイルのパスを間違えていました・・・バカすぎる・・・
しかし存在しないファイルってサイズ0としてアップできたんですね・・・気がつかなかった・・・前にもやってるかも・・・(^^;;;)

#同じファイル名だとUPできないんですね・・・ゴミは削除できればお願いします。

スクリプトエンジン
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=2BSCR001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

WIN32API.VBS
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=2WAPI001.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

まろ さん 2006年 03月 11日 22時 39分 10秒

>>AKA さん
早速のコメントありがとうございました。

>Win9xのSUBSTはDOSアプリなのでPIFファイルで設定しないと自動で終了できません。
WIN2000のSUBSTはDOSアプリではないのでしょうか?

>この1行目が終了せずに停止したままになっているのだと思います。
>このスクリプトを実行すると、WScriptやWinoldapが終了せずに永遠に残っている>と思うので、Ctrl+Alt+Deleteで確認してみてください。また、「,0,True」の0
>を1に変えて1行目のDOSプロンプトが終了しているかどうか確認してみてくださ
>い。
1行目のSUBSTは実行後、停止しているようです。1を0に代えたところ、DOS画面
が出てきて画面を閉じないと次の行を実行しませんでした。

思うような動作が出来ないので、とりあえずBATファイルで対応することにしました。

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

AKA さん 2006年 03月 11日 22時 02分 57秒

WIN32API.VBSもおかしいみたい。

これも別の場所に置きました。

http://gamdev.org/up/img/4934.zip

AKA さん 2006年 03月 11日 21時 45分 36秒

>>管理人むたぐち さん 2006年 03月 04日 15時 44分 02秒

>ただ、これだけの目的のオートメーションオブジェクトをインストールして使うのと、
定数を調べて自分で書く、あるいはソフトの補完機能を使って書くのとで
有意なコストダウンが図れるかどうかは正直微妙なところだと思います。
何か他の機能を持たせるとか、これまでのタイプライブラリを読み込むオブジェクトと
統合するとかしたほうが使いどころも増えるんじゃないでしょうか。

そうですね。その通りだと思います。しかしながら、私の投稿はほとんど実験なので、完成していないのです。開発途上の機能はやはり個別のモジュールにした方が開発側としては都合がいいんですよね・・・(^^;)

それと、私の個人的な感想としては、いらない機能がついてきたりするのも、それはそれで・・・(^^;)あと、無関係っぽい機能を統合する場合のオブジェクト名ってどうつければよいのか非常に悩むところですね・・・

レス、大変ありがとうございました。

>ファイルが壊れているようですよ。

え!残念・・・

原因がわからないので別の場所にUPしました。

http://gamdev.org/up/img/4933.lzh

AKA さん 2006年 03月 11日 20時 52分 21秒

>>まろ さん 2006年 03月 11日 16時 04分 19秒

Win9xのSUBSTはDOSアプリなのでPIFファイルで設定しないと自動で終了できません。
そのために

>WScript.CreateObject("WScript.Shell").Run "subst.exe P: C:\Mail\修正P",0,True

この1行目が終了せずに停止したままになっているのだと思います。
このスクリプトを実行すると、WScriptやWinoldapが終了せずに永遠に残っていると思うので、Ctrl+Alt+Deleteで確認してみてください。また、「,0,True」の0を1に変えて1行目のDOSプロンプトが終了しているかどうか確認してみてください。

AKA さん 2006年 03月 11日 19時 06分 41秒

DW7.04公開。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=DW95704.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

DWの新機能に対応し、関数を大幅に増やしたWIN32API.VBS公開。
http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=WAPI001.ZIP&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

以下は新機能をフルに使ったサンプルです。

DWには不可能はありません。(ただし原理的には、ですが。実用的かどうかは別です(^^;))

そこで「スクリプトからCOM」というのをやってみました。

JScriptではfor in構文でオブジェクトのメンバを列挙できます。これはIDispatchExインターフェースによるものです。(IDispatchExをサポートすると他に、オブジェクトのメンバを動的に追加したり削除したりすることができます。)
VBScriptのオブジェクトもIDispatchExの一部をサポートしています。
サンプルは、VBScriptのオブジェクトでfor inと同じことを行うものです。

なお、ちょっとクレイジーぽいのでDWに同梱とかはしてません(^^;)

CScriptで実行してください。


' スクリプトでCOM
' VBScriptで、JScriptのfor inのようにIDispatchExを使用してメンバ列挙する

Set g_dw = CreateObject("DynamicWrapper")
ExecuteGlobal g_dw.fc("C:\UTL\WIN32API.VBS") 'WIN32API.VBSを展開したフォルダを指定してください

Set X = New CX

X.A = "This is A"
X.B = "This is B"
X.C = "This is C"

Name = ""
Do While True
     Name = GetNextMember(X, Name)
     If Len(Name) = 0 Then
          Exit Do
     End If
     Execute "Value = X." & Name
     WScript.Echo "X." & Name & ": " & Value
Loop

WScript.Quit


Function GetNextMember(Object, Name)
     Dim vObject
     Set vObject = g_dw.VARIANT
     g_dw.PokeVariant vObject.AddressOf, (Object)
     If vObject.vt <> VT_DISPATCH Then
          WScript.Echo "Error: Not Object"
          WScript.Quit
     End If
     Dim pDisp
     pDisp = vObject.pdispVal
     Dim DispMethods
     Set DispMethods = RegisterIDispatchMethods(pDisp)
     Dim pDispExS
     Set pDispExS = g_dw.DWORD
     Dim hr
     hr = DispMethods.QueryInterface(pDisp, IID_IDispatchEx.AddressOf, pDispExS.AddressOf)
     Dim pDispEx
     pDispEx = pDispExS.Value
     If hr <> S_OK Then
          WScript.Echo "QueryInterface() error"
          WScript.Quit
     End If
     Dim DispExMethods
     Set DispExMethods = RegisterIDispatchExMethods(pDispEx)

     Dim dispidS
     Set dispidS = g_dw.DWORD
     If Len(Name) <> 0 Then
          dispidS.Value = 0
          hr = DispExMethods.GetDispID(pDispEx, Name, 0, dispidS.AddressOf)
          If hr <> S_OK Then
               WScript.Echo "GetDispID() error"
               WScript.Quit
          End If
     Else
          dispidS.Value = -1
     End If

     Dim dispidNextS
     Set dispidNextS = g_dw.DWORD
     hr = DispExMethods.GetNextDispID(pDispEx, 0, dispidS.Value, dispidNextS.AddressOf)
     If hr <> S_OK Then
          DispExMethods.Release(pDispEx)
          GetNextMember = ""
          Exit Function
     End If
     Dim pNameNextS
     Set pNameNextS = g_dw.DWORD
     hr = DispExMethods.GetMemberName(pDispEx, dispidNextS.Value, pNameNextS.AddressOf)
     If hr <> S_OK Then
          WScript.Echo "GetMemberName() error"
          WScript.Quit
     End If

     Dim vNameNext
     Set vNameNext = g_dw.VARIANT
     vNameNext.vt = VT_BSTR
     vNameNext.bstrVal= pNameNextS.Value
     DispExMethods.Release(pDispEx)
     GetNextMember = g_dw.PeekVariant(vNameNext.AddressOf)
End Function


Class CX
Public A
Public B
Public C
End Class

まろ さん 2006年 03月 11日 16時 04分 19秒

はじめまして WSH初心者です。

SUBSTコマンドを使用して仮想ドライブを設定したいので下記のようにスクリプトを作成しました。

WScript.CreateObject("WScript.Shell").Run "subst.exe P: C:\Mail\修正P",0,True
WScript.CreateObject("WScript.Shell").Run "subst.exe R: C:\Mail\受信箱",0,True

WIN2000では問題なく仮想ドライブが設定出来るのですが、WIN95では最初の一行
目しか実行されません。

対処法がありましたら教え下さい。

ちゃっぴ さん 2006年 03月 11日 14時 36分 00秒

To たけ さん 2006年 03月 11日 13時 26分 08秒

Autodesk Developer Netowork
http://www.autodesk.co.jp/adsk/servlet/item?siteID=1169823&id=6058873

2004/02/05 AutoCAD Mechanical 2004 DX VBA サンプル
http://www.autodesk.co.jp/adsk/servlet/item?siteID=1169823&id=3953576

たけ さん 2006年 03月 11日 13時 26分 08秒

返信遅くなってしまい申し訳ありません。
>新米MCPさん
文字コードはdxfファイルもtxtファイルも同じでした。
改行コードは、CR、CR+LFと異なっていましたが、改行コード
が違っていると、行の読み込みがうまくいかないのでしょうか?

>管理人むたぐちさん
TextStreamを使っています。
普通にテキストエディタで読むことが可能なデータだったので
バイナリファイルだとは思わず、迷いなく使ってしまっていました。
dxfはcomコンポーネントとして操作するのが一般的なのでしょうか?
(むたぐちさんのご指摘で初めてコンポーネントという考え方を
知りました。ほんと初心者ですみません)
wshを使ってなんとかするのは、やはり難しいのでしょうか?


管理人むたぐち さん 2006年 03月 11日 01時 40分 37秒

To: たけ さん

というより、バイナリファイルをFileSystemObjectのTextStream(ですよね?)で置換するということじたい、かなり冒険してると思うのですが…。
autocadはCOMコンポーネントとしてオートメーション
できないんでしょうか。

新米MCP さん 2006年 03月 11日 01時 31分 32秒

>たけ さん 2006年 03月 11日 00時 59分 14秒

CADが使えない人間なのでdxfファイルもわからないのですが、
もしかして文字コードが違うせいではないでしょうか。

文字コードが違うと、エディタで見たときの見た目は同じでも、文字列の比較は一致しないと思います。
文字コードのわかるテキストエディタを使って、確認してみてください。

たけ さん 2006年 03月 11日 00時 59分 14秒

すみません。
先ほどの投稿に補足です。
拡張子dxfをプログラム上でtxtに変更して置換ができるかを
試してみましたが、それではうまくいきませんでした。
困っています。
どなたか、ご教示ください。
お願いします。

たけ さん 2006年 03月 11日 00時 56分 43秒

WSH&プログラミング初心者です。
先日、指定したフォルダ内にあるテキストデータ中の文字列を置換する
プログラムを作成しました。
テストしてみると、txt形式のデータであれば問題なく動作するのですが
autocad等のdxf形式のデータで試してみると、置換が全く行われません。
データの種類によりプログラムが動いたり、動かなかったりということが
あるのでしょうか?
初心者的な質問で申し訳ありません。
原因や処置方法ご存知の方、同じ状況に遭遇したことのある方などみえまし
たらご教示願います。
よろしくお願いします。

ひでさん さん 2006年 03月 10日 23時 40分 25秒

管理人むたぐちさん、新米MCPさん、返信ありがとうございます。

スクリプトセンターの記事は、ちょくちょく参考にさせてもらっており、
そのまま使えるサンプルスクリプトが掲載されているので、ものすごく重宝してます。
net localgroupコマンドは知りませんでした・・・
月曜日に会社で試してみます。
ありがとうございました。

新米MCP さん 2006年 03月 10日 22時 17分 32秒

>ひで さん 2006年 03月 10日 10時 21分 10秒

>net user /add コマンドでは(略)

ここだけ。
コマンドの場合は net user ではなく net localgroup を使います。

net localgroup Administrators ドメイン名\ユーザー名 /add
こんな感じになります。
WSHに関係ないので、詳細はご自分で調べてくださいね。

管理人むたぐち さん 2006年 03月 10日 14時 57分 40秒

To: ひで さん

スクリプトセンターの記事が参考になるのではないでしょうか。
http://www.microsoft.com/japan/technet/scriptcenter/scripts/ad/users/manage/usmgvb05.mspx

# 個人的にAD環境を組むべきかなあ。仮想環境でもいいし…。

ひで さん 2006年 03月 10日 10時 21分 10秒

ユーザー登録の方法を教えて頂きたく投稿させて頂きます。

ドメイン上(ActiveDirectory)で登録されているユーザーを、ローカルコンピュータ上のadministratorグループに所属するユーザーとして登録したいと思っております。
手動でユーザー登録すれば可能なのですが、スクリプトで追加する方法が分かりません・・・
net user /add コマンドでは、ローカルコンピュータ上でのユーザーしか作成できず、所属するグループもUSERSグループとして作成されてしまいます。
何かいい方法はないでしょうか?

ちゃっぴ さん 2006年 03月 08日 01時 11分 06秒

> MEと2000(SPなし)ではコンポーネントがないため動作しませんでした。

Windows 2000 Professional SP4 では動作確認しております。

> # hoge.comってあるんですね

(爆)しかも IIS 使ってるし・・・すごい攻撃くらいそう・・・


>> アクセス不能です、というエラーになるかバージョンによっては固まってしまいます。

これは、

>「ドメイン間でのデータソースのアクセス」設定が効いているみたいで、

のようですね。とりあえず、私が固まらなかったというのは
同じ Domain 間の移動でしたので

管理人むたぐち さん 2006年 03月 07日 22時 08分 51秒

To: ちゃっぴ さん 、でっどしぃ さん

XP Pro SP2, XP Home SP2, Win Server 2003 SP1での動作を確認しました。
MEと2000(SPなし)ではコンポーネントがないため動作しませんでした。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winhttp/http/winhttp_versions.asp
に、
Windows 2000, Service Pack 3 and later (except Datacenter Server)
Windows XP SP1 and later
Windows Server 2003 SP1 and later
と書いてあるのですが一応確認ということで。

# hoge.comってあるんですね

でっどしぃ さん 2006年 03月 06日 02時 52分 11秒

>ちゃっぴさん
素晴らしいヒントをありがとうございます!
下記のスクリプトでうまくいきました(抜粋)。

var url = "http://hoge.com/test.html";
var WinHttpRequestOption_EnableRedirects = 6;
var hr = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
hr.Option(WinHttpRequestOption_EnableRedirects) = false;
hr.Open("HEAD", url, false);
hr.Send();
hr.Option(WinHttpRequestOption_EnableRedirects) = true;
sResponseHeader = hr.getAllResponseHeaders();
WScript.Echo(sResponseHeader);

ちゃっぴ さん 2006年 03月 06日 02時 27分 42秒

To でっどしぃ さん 2006年 03月 05日 23時 35分 39秒
To 管理人むたぐち さん 2006年 03月 06日 01時 02分 52秒

> XMLHTTPというコンポーネントを使えばHTTPヘッダを取得することは
> 可能なんですが、残念ながらLocation:でリクエストを飛ばすページは
> 正常取得できないのです。

面白いものをみつけたのでご報告。

MSXML2.XMLHTTP と非常に似ているものに、
WinHttp.WinHttpRequest という Class を発見しました。

WinHttpRequest object [HTTP]
http://msdn.microsoft.com/library/en-us/winhttp/http/winhttprequest.asp?frame=true

これによると、Option(WinHttpRequestOption_EnableRedirects) が
規定で True になっているようで、それを False に変更しない限り、
勝手に Redirect されて取得できないようです。

Windows XP では Registry に "WinHttp.WinHttpRequest.5.1" と
登録されています。あとはやり方が全く同じなのでわかるでしょう。

> アクセス不能です、というエラーになるかバージョンによっては固まってしまいます。

ちなみに私の環境 Windows XP MSXML 6 までが Install
でも、上記現象は発生しないですね。

でっどしぃ さん 2006年 03月 06日 02時 17分 29秒

>むたぐちさん
ありがとうございます。
確かにアクセスエラーが出ました。
色々試してみたところインターネット・オプションの「ドメイン間でのデータソースのアクセス」設定が効いているみたいで、これを有効にすることでエラーは出なくなりました。ただこの場合、リダイレクトそのものが行われてしまい、取得されるヘッダはリダイレクト後のページのものになってしまいました・・・。ちょっと悔しいです(笑)。

管理人むたぐち さん 2006年 03月 06日 01時 02分 52秒

To: でっどしぃ さん
> Windows に標準搭載されているコンポーネントでHTTPヘッダを取得することは可能ですか? ある URL をリクエストして、そのレスポンスを参照して、リダイレクト先の URL(Location ヘッダ)を知りたいのです。

XMLHTTPというコンポーネントを使えばHTTPヘッダを取得することは
可能なんですが、残念ながらLocation:でリクエストを飛ばすページは
正常取得できないのです。
アクセス不能です、というエラーになるかバージョンによっては固まってしまいます。

一応、動いたらいいな動かないけど、的コードを載せておきます。

var xh = new ActiveXObject("Microsoft.XMLHTTP");
var sURL = "http://www.example.com/test.html"
xh.Open("GET", sURL, false);
xh.Send ();
sResponseHeader = xh.getAllResponseHeaders();
sResponseHeader.match(/^Location\:(.+)/g);
WScript.Echo(RegExp.$1);

XMLHTTPの不具合については過去ログを。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list108.shtml

> 標準コンポーネントが無理であれば他のコンポーネントでも構いません。

BASP21が使えます。と思ったんですがBASP21のsocketオブジェクトの
readlineメソッドは引数に参照渡しの変数を渡すのですが、
JScriptではこれが不可能です。
事実上使用できない、と思います。

結局私にはいい方法が思い浮かびません。
どなたかフォロー願います。

でっどしぃ さん 2006年 03月 05日 23時 35分 39秒

こんにちは。突然の質問お許しください。

Windows に標準搭載されているコンポーネントでHTTPヘッダを取得することは可能ですか? ある URL をリクエストして、そのレスポンスを参照して、リダイレクト先の URL(Location ヘッダ)を知りたいのです。言語は JScript を使いたいと思っています。標準コンポーネントが無理であれば他のコンポーネントでも構いません。

よろしくお願い致します。



管理人むたぐち さん 2006年 03月 04日 15時 44分 02秒

To: SIGNAL9 さん

> なんかすごく久しぶりにバージョンアップに着手しております(あまり
> 時間が取れないもので遅々とした歩みではありますが…)。
> お時間が許すようでしたらバグ出しにご協力願えませんでしょうか。

今主に携帯のサムネイル画像を生成するのにDoodle2を使っているので、
βと入れ替えて試してみますね。

サンプルに採用してくださってありがとうございます。


To: AKA さん 2006年 02月 25日 06時 48分 41秒

> タイプライブラリから定数を読み込んで結合するオートメーションオブジェクトを作りました。

使ってみました。
Excel.Applicationなどバージョンによって定数値の中身が違ってたりする場合に
特に有効かと思いました。
XMLHTTPやADODB.Streamのめんどっちい定数も宣言なしで使えるのがいいですね。

ただ、これだけの目的のオートメーションオブジェクトをインストールして使うのと、
定数を調べて自分で書く、あるいはソフトの補完機能を使って書くのとで
有意なコストダウンが図れるかどうかは正直微妙なところだと思います。
何か他の機能を持たせるとか、これまでのタイプライブラリを読み込むオブジェクトと
統合するとかしたほうが使いどころも増えるんじゃないでしょうか。


To: AKA さん 2006年 03月 04日 06時 25分 50秒

> 私も簡単なスクリプトエンジンを作ってみました。

ファイルが壊れているようですよ。

AKA さん 2006年 03月 04日 06時 25分 50秒

私も簡単なスクリプトエンジンを作ってみました。

ここで「エンジン」と呼んでいるのはアクティブスクリプトの用語における「スクリプトエンジン」であり、「スクリプトホスト」と対になるものです。
すなわちこの「エンジン」には「ホスト」は含まれていませんので、WScript.exe、あるいはCScript.exeをホストとして実行して下さい。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=BSCR001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

例によって感想募集。

新米MCP さん 2006年 03月 03日 21時 28分 47秒

>ちゃっぴ さん 2006年 03月 03日 02時 19分 44秒

ご教示ありがとうございます。
Windows98SEのPCを引っ張り出してみたら、仰る通りでした。
IE5.5の入ったWindows98SEのタスクは、細かい設定ができるようになっていました。
標準になったのがW2kからということは、多分IE5以上で入るということかな。

そういえば何年も前に、IEをバージョンアップしたらタスクスケジューラが強化されるという話を聞いたことがあります。
当時は興味を惹かれなかったので忘れてましたが、そういう意味だったんですね…。

ちゃっぴ さん 2006年 03月 03日 02時 19分 44秒

To 大橋 さん (yoohashi@oec-o.co.jp) 2006年 03月 02日 14時 46分 57秒
To 新米MCP さん 2006年 03月 02日 19時 00分 45秒

Task Scheduler API 自体はもっと以前からあるはずですよ。
Windows 2000 では標準で持っているはずですし、
NT とかでも IE の Version によっては Install されていたはずです。
つまり、API を呼び出すような Program を作ってやれば
以前の環境でも実行可能ということ。

ただし、これは純粋に API の話で、Command Line から扱えるように
なったのは Windows XP Professinal 以降です。

あと、AT でも起動 Account を切り替えればできるんですけど、
これをやってしまうと、AT で起動される Process がすべて
その Account で起動されるようになるため、あまり推奨された
やり方ではありません。

新米MCP さん 2006年 03月 02日 19時 00分 45秒

>大橋 さん (yoohashi@oec-o.co.jp) 2006年 03月 02日 14時 46分 57秒

私も以前、同じようなことをしようとして色々調べたことがあります。
その結果、わかったことを説明します。
先に結論だけ書いておくと、その内容でスケジュールを作成するには、WindowsXP Pro以上のOSが必要です。

タスクスケジュールを作成するインターフェイス(API)は2種類あって、それが混在しています。
ひとつは「AT API」、もうひとつは「タスクスケジューラ API」です。

「AT API」は、古いタスクスケジュールのインターフェイスです。
「タスクスケジューラ API」の方はWindows2000以降で使われるようになったもので、細かい設定ができるようになっています。
ちなみにWindows2000以降のOSにも、「AT API」は残っています。

スクリプトでタスクスケジュールを設定する方法は一応あるのですが、「AT API」が使われます。
(方法はこちら:http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/sept04/hey0922.mspx)
残念ながら、この方法ではアカウントを指定したり、ログオン時に実行、などの設定はできません。
Win32_ScheduledJobクラスには、そもそもそういう設定をする方法がないからです。
(参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_scheduledjob.asp)

別解として、WindowsXP Pro以上のOSに入っているschtasks.exeというコマンドを使えば、「タスクスケジューラ API」によるスケジュールを作成することができます。
スクリプトからでも、WshShell.Execなどを使用してschtasks.exeを起動してやれば、大橋さんの希望するようなスケジュールが可能です。
(sthtasks.exeの使用法はこちら:http://www.atmarkit.co.jp/fwin2k/win2ktips/582schtasks/schtasks.html)

ただしschtasks.exeはWindows2000以前のWindowsには入っていません。聞いたところではWindowsXP Homeにも入っていないそうです。
WindowsXP Home以下のOSでも動作させるなら、スケジュールの内容を「AT API」でも作成できるよう見直すか、他の方法を考える必要がありそうです。

ちなみに前述URLのスクリプトセンターの記事では、タスクの時間指定が日本時間になっていません。
時間指定の最後、-420になっているところを+540にしてやらないといけないので注意してください。

' APIの名前はスクリプトセンターの記事に拠りました。

SIGNAL9 さん 2006年 03月 02日 16時 34分 38秒

>むたぐちさま、皆様

大変ご無沙汰いたしております。
リンクページでご紹介いただいておりますDoodle2の作者でございます。

なんかすごく久しぶりにバージョンアップに着手しております(あまり
時間が取れないもので遅々とした歩みではありますが…)。
お時間が許すようでしたらバグ出しにご協力願えませんでしょうか。

下記ページ(私のBlogのエントリ)にベータ版のDL先を記述しました。
http://signal9.exblog.jp/3600697/

#ずっと前、むたぐちさんに御提案頂いたビデオキャプチャ機能は頓挫
#しましたm(__)m
#また、勝手ながら、本掲示板に投稿されていたむたぐちさん作のスク
#リプトをサンプルのひとつとして同梱させて頂いています。

大橋 さん (yoohashi@oec-o.co.jp) 2006年 03月 02日 14時 46分 57秒

はじめまして。大橋と申します。

WHSでWindowsのタスクを自動で設定する事は可能でしょうか?
設定したいタスクは以下のような内容です。

 実行するファイル:  バッチファイル
 実行するタイミング:ログオン時
 アカウント:    Administrator

更に欲を言えば、同じ名前のタスクが既に存在する場合は一度削除し、
再登録を行いたいのです。

よろしくお願いします。

ひろ さん 2006年 03月 01日 10時 47分 27秒

To:管理人むたぐちさん

ありがとうございます。

WSHShell.Run """C:\起動.VBS へのショートカット.lnk"""

↑で出来ました!!

管理人むたぐち さん 2006年 03月 01日 01時 15分 44秒

To: ひろ さん
> 以下のような内容でショートカットファイルを開くVBScriptを作成し、ショートカットファイルを開くと
> ショートカットファイルのリンク先のVBScriptが起動してしまいます。
>
> Set WSHShell = WScript.CreateObject("WScript.Shell")
> WSHShell.Run "C:\起動.VBS へのショートカット"

ちょうどこのところ話題になっていたことなのですが、WshShell.Runで
ファイルのパスを記述するときは、原則 "" で括らなければなりません。
特にこの場合のようにパスにスペースが含まれている場合は
省略できません。このように記述してしまうと、
"C:\起動.VBS"に、"へのショートカット"というコマンドラインオプションを
与えているという意味になってしまうので、起動.VBSが起動してしまうわけです。

正しくは、
WSHShell.Run """C:\起動.VBS へのショートカット.lnk"""
ですね。拡張子も忘れずに。
コマンドラインオプションを与えるには、
WSHShell.Run """C:\起動.VBS へのショートカット.lnk"" オプション"
のようにすると良いでしょう。

# で、あってますか?ちょっと自信なし…。


To: ハイジ さん
> 画面の解像度を取得することは可能でしょうか?

IEのオブジェクトを使えば可能です。
NT4.0ではもしかしたら無理かも…。ちょっと今すぐは確認できません。

Set IE=CreateObject("InternetExplorer.Application")
IE.Navigate "about:blank"
While(IE.busy)
     WScript.Sleep 100
Wend
While (IE.Document.readyState <> "complete")
     WScript.Sleep 100
Wend
Set Screen= IE.Document.parentWindow.screen
Msgbox Screen.Width & " x " & Screen.Height



To: Fusa さん
> SFNからLFNに変換、、、出来たら逆の変換も加えて
> 相互変換する方法は、ありますでしょうか?

SFNからLFNはShellオブジェクトのFolderItemオブジェクトの
Pathプロパティを取ることで可能です。
また、LFNからSFNは、FileSystemObjectのFile/Folderオブジェクトの
ShortPathプロパティから取れます。

Set Fs = CreateObject("Scripting.FileSystemObject")
Set Shell = CreateObject("Shell.Application")

msgbox LFN2SFN("C:\Program Files")
msgbox SFN2LFN("C:\Progra~1\Intern~1\IEXPLORE.EXE")

Function LFN2SFN(strPath)
     'LFN→SFN
     Dim obj
     If Fs.FileExists(strPath) Then
          Set obj = Fs.GetFile(strPath)
     ElseIf Fs.FolderExists(strPath) Then
          Set obj = Fs.GetFolder(strPath)
     End If
     If Not IsEmpty(obj) Then
          LFN2SFN = obj.ShortPath
     Else
          LFN2SFN = ""
     End If
End Function

Function SFN2LFN(strPath)
     'SFN→LFN
     If Fs.FileExists(strPath) Then
          SFN2LFN = Shell.NameSpace(Fs.GetParentFolderName(strPath)).ParseName(Fs.GetFileName(strPath)).Path
     ElseIf Fs.FolderExists(strPath) Then
          SFN2LFN = Shell.NameSpace(strPath).Self.Path
     Else
          SFN2LFN = ""
     End If
End Function

Fusa さん 2006年 02月 28日 23時 39分 20秒

SFNからLFNに変換、、、出来たら逆の変換も加えて
相互変換する方法は、ありますでしょうか?

よろしくお願いします。

ハイジ さん 2006年 02月 28日 17時 28分 45秒

画面の解像度を取得することは可能でしょうか?
OSはNT4.0なんですが・・・。
よろしくお願いします。

ひろ さん 2006年 02月 28日 15時 02分 18秒

エクセルを起動するVBScriptを作成し、そのファイルのショートカットファイルを作成しました。
ショートカットのリンク先でファイル名をパラメータとして指定しています。

ショートカットファイルをダブルクリックすると、パラメタに指定されたファイルが開くのですが
以下のような内容でショートカットファイルを開くVBScriptを作成し、ショートカットファイルを開くと
ショートカットファイルのリンク先のVBScriptが起動してしまいます。

Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "C:\起動.VBS へのショートカット"

VBSscriptから、パラメータを持ったショートカットファイルを起動するにはどうすれば良いのでしょうか?
よろしくお願いします。

なんだか、わかり難いので各ファイルの役割を下記にまとめます。

@エクセルオープン.vbs・・・Aからファイル名を取得してエクセルを開きます。
Aエクセルオープン.vbsのショートカット・・・ファイル名を渡して@を起動します。
B起動.vbs・・・Aを起動します。

よろしくおねがいします。

AKA さん 2006年 02月 25日 06時 48分 41秒

タイプライブラリから定数を読み込んで結合するオートメーションオブジェクトを作りました。

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=TLBR001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

これで定数をいちいち再定義する必要はなくなります。(WSFならできるけど)

感想募集。



>>管理人むたぐち さん 2006年 01月 13日 23時 22分 04秒
>●DictionaryオブジェクトとClassステートメントを用いた
> コレクションクラスもどきのテンプレート

ケチつけるだけでなく(^^;)私もそんなようなコード晒してみます。


Option Explicit

Main
WScript.Quit


Sub Main
     Dim Customers
     Set Customers = New Customers

     Dim Customer
     Set Customer = New Customer
     Customer.Name = "John"
     Customer.BirthDay = "1901/01/01"
     Customers.Add Customer

     Set Customer = New Customer
     Customer.Name = "Bob"
     Customer.BirthDay = "2001/01/01"
     Customers.Add Customer

     'Customers.Add 0 'これはエラー

     Dim I
     For I = 0 To Customers.Count - 1
          Set Customer = Customers.Item(I)
          WScript.Echo Customer.Name & " " & Customer.BirthDay
     Next

     'For Each Customer In Customers 'これができない
     For Each Customer In Customers.Collection 'これは醜い。が仕方がない
          WScript.Echo Customer.Name & " " & Customer.BirthDay
     Next

     'WScript.Echo Customers.Item(Customers.Count).Name 'これはエラー
End Sub


Class Customers
Private Dictionary
Public Property Get Collection
     Set Collection = Dictionary
End Property
Private Sub Class_Initialize
     Set Dictionary = CreateObject("Scripting.Dictionary")
End Sub
Public Property Get Count
     Count = Collection.Count
End Property
Public Property Get Item(Index)
     If Index < 0 Or Count <= Index Then
          WScript.Echo "Bad Index"
          WScript.Quit
     End If
     Set Item = Collection.Keys()(Index)
End Property
Public Function Add(NewItem)
     If Not IsObject(NewItem) Or TypeName(NewItem) <> "Customer" Then
          WScript.Echo "Not Object or Different Object"
          WScript.Quit
     End If
     Collection.Add NewItem, Empty
End Function
End Class


Class Customer
Public Name
Public BirthDay
End Class


やはりディクショナリでコレクションの代わりをしようとしても醜いだけですね〜

「Scripting.」だってのに汎用コレクションを入れないとは・・・VBAしか頭にないMSを呪うしかない・・・


というわけで・・・

>>ばんのしゃーによかばんた さん 2004年 11月 19日 15時 59分 40秒
>VBScriptでCollection

>>ばんのしゃーによかばんた さん 2004年 11月 20日 14時 39分 08秒
>改版

さらにこんなのは?

<?xml version="1.0" encoding="UTF-8"?><package>
<component>
<public>
<method name="Item" dispid="0" />
<method name="_NewEnum" dispid="-4" />
<method name="Add" />
<property name="Count" />
</public>
<script language="VBScript"><![CDATA[

Option Explicit
Private dic
Set dic=CreateObject("Scripting.Dictionary")

Public Sub Add(value)
dic.Add Value, Empty
End Sub

Public Function Item(ind)
Item=dic.Keys()(ind)
End Function

Public Function [_NewEnum]()
[_NewEnum]=dic.[_NewEnum]
End Function

Public Function Count()
Count = dic.Count
End Function

']]></script>
</component>
</package>

〆サバ さん 2006年 02月 23日 09時 54分 38秒

TO:管理人むたぐちさん
早速教えていただきありがとうございました!うまく動きました。
またよろしくお願いいたします。

管理人むたぐち さん 2006年 02月 22日 14時 08分 57秒

To: 〆サバ さん

VBSファイルは、他のVBSファイルをインクルードしてそこに記述された
関数を使うということができませんが、単に他のVBSファイルを実行
してやるだけなら、WshShellオブジェクトのRunメソッドで可能です。

ログ作成.vbsの中に、
Set WshShell= WScript.CreateObject("WScript.Shell")
WshShell.Run "SendMail.vbs"

として実行してやれば良いでしょう。

〆サバ さん (zanji_kirin@yahoo.co.jp) 2006年 02月 21日 23時 41分 50秒

こんばんわ。ここでこのような質問をしても良いものかどうか迷いましたが、
質問させて頂きます。
vbsでログを削除するバッチを作成しております。
ログを吐き出す「ログ作成.vbs」とそのログをメール送信する「SendMail.vbs」の2つを作成したのですが、ログ作成.vbsを実行するだけで、メール送信までいけるように、ログ作成.vbsの中にSendMail.vbsを呼び出すというか走らせる記述の方法がわからず、困っております。どなたかお知恵をおかし願えますでしょうか?
よろしくお願いいたします。

AKA さん 2006年 02月 18日 06時 23分 03秒

オートメーションオブジェクトを調査するオブジェクトを作ってみました。ただし、タイプライブラリもIDispatchExも使いません(^^;)

http://winscript.s41.xrea.com/wiki/index.php?plugin=attach&pcmd=open&file=AINS001.LZH&refer=%5B%5B%A5%A2%A5%C3%A5%D7%A5%ED%A1%BC%A5%C0%A1%BC%5D%5D

今回のバージョンでは、
1. サーバーファイル名を取得するメソッド
2. 指定した名前のメンバが存在するかどうかを調べるメソッド
3. 指定した長さの名前のメンバを列挙するメソッド
があります。

なお、「指定した長さの名前のメンバを列挙するメソッド」は長さを大きく指定するといつまでたっても返ってこないので注意してください(^^;) 長さは3程度でも、数秒〜十数秒かかります。
というかTLBINF32.DLLを持ってさえいればこのメソッドが必要になる局面はあまりないと思いますが・・・例えばDWのようにタイプライブラリをサポートしないものには使えるでしょう。

例によって感想募集。

タイプライブラリを使ってTLBINF32.DLLにあるような機能を実装してもいいんだけど、需要ないよね? すでにTLBINF32.DLLがあるからなー・・・


>>ちゃっぴ さん 2006年 01月 29日 18時 32分 24秒

>LFN の Path とか Command Line の Parameter を扱う場合には、
>基本的に "" でくくるべきということを第一に教えればまったく問題が
>ないことです。
>ただし、半角Space を含む場合にはそれを省略できます。
>というのが、本来の教え方でしょう。
>ですが、現状では半角 Space を含む場合には、"" でくくる必要がありますって
>教え方してますね。それが一番の問題です。

これは言いすぎ。

>半角 Space を含む場合には、"" でくくる必要がありますって教え方

基本はこの教え方で間違いない。スペースやタブ文字が含まれていないことがはっきりとしている場合には""でくくる必要は全くない。

>半角 Space が含まれる可能性が少しでもあるなら、"" でくくる。

は正しいんだけれどね。


あと、前にも書いたけど、""は別にロングファイル名の指定法ではなく、もともとCプログラムにホワイトスペースを含む文字列を単一のパラメータとして認識させるための仕組み。

Cの仕様はUNIXの操作系そのものと強く結びついているからUNIXやDOSのコマンドラインも同じになる。


>>ばんのしゃーによかばんたさん
今回ばんのしゃーによかばんたさんは私の書き込みによって知らなかった情報を知り、知識が増えたわけですが、別にお礼とかはいいです(^^;)
その代わりと言っては何ですが、初心者的な質問やつまらなそうな質問にも一言二言レスをつけてあげては頂けないでしょうか?
ばんのしゃーによかばんたさんなりにつけてくださっているとは思うのですが、質問にかぶせるように他の話題をたくさんつけると質問者が困惑してしまいます。

もちろん誰かが先に答えている場合や忙しい時はいいですので。

まあ意見するとかそういう偉そうな物ではなく、参考にしていただければ、ということで。

うるとらまん さん 2006年 02月 16日 11時 49分 14秒

>新米MCP さん 2006年 02月 15日 21時 18分 57秒

非常に詳しくご丁寧にご回答いただき、ありがとうございます。
おかげで、インタネットショートカットに任意の自作アイコンを付ける事が出来ました。
重ねて御礼申し上げます。

管理人むたぐち さん 2006年 02月 15日 23時 59分 24秒

To: ちゃっぴ さん 2006年 02月 11日 17時 41分 24秒

> ただし、理解しているのであれば、そういう Sample を示すべきではないでしょう。
> 初めて扱う人は、それこそ Sample をそのままとか、
> 理解せずにちょっと変更して利用するもんですから・・・

そうですね、これからはコマンドラインを原則""でくくるということを
明記した上で、「この例では簡単にこのようにも書ける」と
例示していこうかと思います。



To: バッチ作成中 さん

FileSystemObjectのCopyFileでは、一度に複数のターゲットを指定することはできません。
なので、FolderオブジェクトのSubFoldersメソッドを用い、For Each ステートメントを
使って一つ一つ指定していく必要があります。

Set Fs = CreateObject("Scripting.FileSystemObject")
Set oRootFolder = Fs.GetFolder("C:\Documents and Settings")
For Each oSubFolder In oRootFolder.SubFolders
     Fs.CopyFile "a:\Favorites\*.*", Fs.BuildPath(oSubFolder.Path,"Favorites\")
Next

バッチ作成中 さん 2006年 02月 15日 23時 20分 36秒

こんばんは。すみませんが、WindowsXPの
C:\Documents and Settingsのユーザホルダの配下のお気に入りの中のファイルだけを
ディスク上にある各ユーザフォルダのお気に入りにコピーする方法はありますでしょうか?
どのようなコマンドを使えばよろしいでしょうか?
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.CopyFile "a:\Favorites\*.*", "C:\Documents and Settings\すべてのユーザフォルダ\Favorites\"

"C:\Documents and Settings\*\Favorites\" と使えなかったので方法がわからず。どなたか、教えてください。

新米MCP さん 2006年 02月 15日 21時 18分 57秒

>うるとらまん さん 2006年 02月 15日 10時 14分 23秒

URLショートカットはWshUrlShortcutオブジェクトで作成します。
しかしWshUrlShortcutオブジェクトには、作成したURLショートカットファイルのアイコンを変更するメソッドはありません。
ではアイコンは変更できないのかと言うと、方法がないわけでもありません。

URLショートカットの中身は、実はただのテキストです。
ですから、ファイルシステムオブジェクトなどを使用してテキストを編集してやれば、アイコンの変更は可能です。
以下に例を示します。

'----- スクリプトここから -----

'まずはURLショートカットを作成
Set WshShell = CreateObject("WScript.Shell")

strPath = "C:\Documents and Settings\All Users\デスクトップ\スクリプトセンター.url"

Set WshUrlShortcut = WshShell.CreateShortcut(strPath)
WshUrlShortcut.TargetPath = "http://www.microsoft.com/japan/technet/scriptcenter/default.mspx"
WshUrlShortcut.Save()

'作成したURLショートカットをテキストとして開く
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objNewShortcut = objFso.OpenTextFile(strPath,8)     '追記用に開く

'2行追記。WScript.exeの中の、3個目のアイコン(最初は0なので、記述は2になる)を指定。
objNewShortcut.WriteLine("IconIndex=2")
objNewShortcut.WriteLine("IconFile=C:\WINDOWS\System32\WScript.exe")
objNewShortcut.Close()

'----- スクリプトここまで -----

以上です。
上記のスクリプトを走らせると、スクリプトセンターへのURLショートカットが、VBSファイルのアイコンになって作成されると思います。

先にも述べたようにテキストを2行追記するだけですから、他にどんな方法を使って追記しても同じです。
逆に、URLショートカットそのものを最初からテキストとして作成することも可能です。

うるとらまん さん 2006年 02月 15日 10時 14分 23秒

インターネットショートカットを作った後、アイコンを変更する仕方がわかりませんので、教えてください。

Return