タグ:VBScript ( 19 ) タグの人気記事
(WSH)VBScriptでバイナリファイルのバージョンを取得したい

当初バッチファイルでバイナリファイル(exeとかdllとか)のバージョンを取得しようと思ってましたが、別途ツールをいけないらしく結構面倒そうでした。
(とりあえず,@IT:バイナリ・ファイルのバージョンを調べるコンピュータ系blog:バイナリファイルのバージョンを調べる方法が参考になります)

VBScriptだったら簡単に取得できるようでした。
参考先まるままですが、以下のコードで取得できるようです。

dim path
path="C:\Program Files\JUJO\HardKey EG Pro\FlashCtl.dll"
MsgBox GetVersion(path)
 
Function GetVersion(pathspec)
Dim fso, temp
Set fso = CreateObject("Scripting.FileSystemObject")
temp = fso.GetFileVersion(pathspec)
If Len(temp) Then
GetVersion = temp
Else
GetVersion = "バージョン情報はありません。"
End If
End Function


参考:
VBScriptでファイルのバージョン情報を取得するには - aspxの日記2009
[PR]
by Jehoshaphat | 2013-03-21 22:16 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(VBScript)ネットワークドライブを張る方法
ネットワークドライブをコマンドで割り当てるで net use コマンドを使ってネットワークドライブを張る方法を描きました。
これを下記のようにVBScriptで実行することができます。(ユーザ名とパスワード指定)

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
'ネットワークドライブに割り当て
objShell.Run("net use w: \\sv01\share hogepasswd /user:userhoge" )


また、WScript.Network オブジェクトを使う方法もあるようです。
その場合、下記のようになります。

Dim objWshNetwork
Set objWshNetwork = WScript.CreateObject("WScript.Network")
objWshNetwork.MapNetworkDrive "x:", "\\sv01\share", False, "userhoge", "hogepasswd"


第三引数以降を省略すると現在ログオンしているユーザでの接続を試みるようです。

ユーザを指定して接続する場合、スクリプト内にパスワードを平文で書かないといけません。
セキュリティリスク低下を防ぐために、ユーザにパスワードのみ入力させる方法についてあんだあどらいぶ:windowsXPでネットワークドライブに自動的にログインする方法(wsh)が詳しく解説しています。

参考:
@IT:ネットワーク・ドライブの接続 MapNetworkDriveメソッド
[PR]
by Jehoshaphat | 2011-09-21 23:36 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
WindowsPCのIPアドレスをVBScript(WSH)で簡単設定
WindowsPCのIPアドレスをコマンドプロンプト,バッチファイルで簡単設定で netsh を使ったIPアドレス設定方法を書きましたが、唯一のネックはネットワークアダプタ名を(ネットワークインターフェイス名、NIC名)を指定しないといけないことです。
環境によってネットワークアダプタ名は異なりますし、複数NICがある場合もあります。

ということで、ある程度エンドユーザが設定しやすくするにはネットワークアダプタ名を自動で取得するように、また複数あるときはどのNICを使うか選べるように VBScript で作ってみました。

ネットワークアダプタ名を自動的に取得し、NICが一つしかなければそれに対して設定し、複数ある場合はどれに設定するか選ぶようにするというものです。


Option Explicit
Dim New_IP, SubNet_Mask , D_Gateway ,DnsSv1 , DnsSv2
Dim objShell,iName,i,WSHShell,networks,Item
'IPアドレス
New_IP = "192.168.0.100"
'サブネットマスク
SubNet_Mask = " 255.255.255.0"
'デフォルトゲートウェイ
D_Gateway = "192.168.0.1"
'プライマリDNSサーバ
DnsSv1 = "192.168.125.2"
'セカンダリDNSサーバ
DnsSv2 = "192.168.125.3"
 
Set objShell = CreateObject("Shell.Application")
'ネットワークカード情報取得
Set networks = objShell.Namespace(&H31&)'NETWORK_CONNECTIONS
'NIC選択ダイアログに表示する As String
iName = ""
'ネットワークカード名の配列
Dim iNameAry()
ReDim iNameAry(networks.Items.Count)
 
i=0
For Each Item in networks.Items
'ネットワークアダプタ名を取得
iName = iName & vbCrLf & i & ": """ & Item.Name & """"
iNameAry(i) = """" & Item.Name & """"
i=i+1
Next
'NICが複数あれば選択させる
If networks.Items.Count > 1 Then
Dim nicSelect
nicSelect = InputBox("設定するネットワークカードの数字を入力してOK押下選んでください。(0~" & networks.Items.Count-1 & "の値)" & _
vbCrLf & iName,"入力ダイアログ","0")
If IsEmpty(nicSelect ) Then
MsgBox "キャンセルしました。"
WScript.Quit
End If
If Not IsNumeric(nicSelect) Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
ElseIf CDbl(nicSelect) > (networks.Items.Count-1) Or nicSelect*1000 Mod 1000 <> 0 Or CDbl(nicSelect) < 0 Then
MsgBox "設定した値に誤りがあります。もう一度実行し直してください。"
WScript.Quit
Else
End If
End If
Set WSHShell = WScript.CreateObject("WScript.Shell")
'netshコマンドを使って設定
WSHShell.Run "cmd.exe /c netsh interface ip set address " & iNameAry(nicSelect) & " static " & New_IP & " " & SubNet_Mask & " " & D_Gateway & " none", 0, True
WSHShell.Run "cmd.exe /c netsh interface ip set dns " & iNameAry(nicSelect) & " static " & DnsSv1 , 0, True
WSHShell.Run "cmd.exe /c netsh interface ip add dns " & iNameAry(nicSelect) & " addr=" & DnsSv2 ,0, True
 
MsgBox "IPアドレスの設定が終了しました。"


このスクリプト冒頭のIPアドレス情報を変更して、それぞれの設定をファイル毎に持たしておいて後は実行すればOKですね。
[PR]
by jehoshaphat | 2011-08-11 12:26 | ネットワーク | Trackback | Comments(0)
VBScriptのModの結果は小数点以下を返さない!?
VBScriptで下記のようなコードを書きました。
MsgBox 1.5 Mod 1

しかし、表示されるのは 0 です。

本来なら、0.5 とならないといけないですが。。。

Mod 演算子を見たら驚愕の事実が。。
結果が浮動小数点数の時は整数に丸められるようですorz

整数かどうか判断するのに使いたかったのですが、ダメですね。
どうやらVB6でも同様のようです。


結局下記のように値を増やして対応するしかないですかね。。
MsgBox 1.5*1000 Mod 1000

これでも、小数第四位より深い桁以降は判定できなくなりますが。。。
[PR]
by jehoshaphat | 2011-07-10 23:20 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
VBScriptは型宣言ができない!?
VBScriptで下記のように書いてみました。

Dim str As String
str= "hogehoge"
MsgBox str

すると、「ステートメントの末尾が不正です。800A0401」というエラーが。。。

下記のようにすると、うまく走りました。

Dim str
str= "hogehoge"
MsgBox str

どうやら、VBScriptでは型宣言ができないようです。
型の概念はあるのに宣言できないとは変な話です。。。
VBScriptやVB6は宣言と同時の初期化もできず不便ですね。
特にInputBoxで数字を入力させる場合、文字列として入ってくるので手動でキャストしてやる必要があります。

参考:
型宣言はないが変数には型がある
[PR]
by jehoshaphat | 2011-07-10 23:18 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
VBScriptで配列宣言時に要素数を変数で指定したい
VB.NetやC系言語だと、下記のように配列宣言時に要素数を変数で指定できます。

Dim i As Integer
i = 3
Dim ary(i)

しかし、VBScriptだと配列宣言時に要素数を変数で指定できません。(VB6も?)
なので、とりあえず空の配列を定義し、ReDimで要素数を変更するという手段を取らざるをえません。
こんな感じです。

Dim i As Integer
i = 3
Dim ary()
ReDim ary(i)

C系になれると扱いずらい VBScript です。
[PR]
by jehoshaphat | 2011-07-10 23:17 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(WSH)VBScript(またはVB6)でAndAlsoをどうすればよいか?
VB.NetやC系言語,Javaでは論理演算子として AndoAlso,OrElse(VB.Net) , &&,||(C,Java) を一般的に使います。
AndAlso,&& は左辺を評価して false なら右辺は評価しません。
OrElse,|| は左辺を評価して true なら右辺は評価しません。

この演算子はショートサーキット演算子(短絡演算子)と呼ばれるらしく、処理速度を上げたり、ソースを見やすくする上で役立ちます。

しかし、VB6やVBScriptにはこのショートサーキット演算子は使えません。
なので下記のように文字列変数 x が整数の0~10の値かどうかというのを判定するのには、AndAlso が使えないので、下記のようにIF分をネストして書かないといけません。


If IsNumeric(x) Then '数字か
If x Mod 1 = 0 Then '整数か
If x <= 10 Then '10以下か
If x >= 0 Then '0以上か
'正しい処理
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End If
Else
MsgBox "設定した値に誤りがあります"
End IF

(上記は実は、Mod のところや x<=10 , x>=0 は And 演算子でまとめられますが、例ということで。。。)



ネストしまくると非常に見にくいので見やすい方法ないかなとおもって探すと、If AndAlso や OrElse の代替方法 でいい方法がありました。
下記のような感じになります。

If Not IsNumeric(x) Then
MsgBox "設定した値に誤りがあります"
ElseIf x > 10 Then
MsgBox "設定した値に誤りがあります"
ElseIf x Mod 1 <> 0 Then
MsgBox "設定した値に誤りがあります"
ElseIf x < 0 Then
MsgBox "設定した値に誤りがあります"
Else
'正しい処理
End If

条件が逆になります。つまり間違いとなる条件を書くわけですね。
ただ、この方法にしても行が長くなるのはいたし方ありません。エラーメッセージを何度も書かないといけませんしね。(このへんはエラー表示関数とかでカバーする必要がありますが。。)

ちなみに、VB.Netだと AndAlso 使ってこう書けます。

If IsNumeric(x) AndAlso x Mod 1 = 0 AndAlso x <= 10 Then AndAlso x >= 0 Then
'正しい処理
Else
MsgBox "設定した値に誤りがあります"
End If



参考:
VBの And Or 演算子はショートサーキットしない | tk-engineering.com Technical blog:
(vb.net)VB.Net、VB2005で変わった点1
[PR]
by jehoshaphat | 2011-07-10 23:16 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(WSH)VBScriptでユーザが特定のグループに属しているかを判定する
ログインスクリプトで、特定のグループに所属するユーザだけ任意の処理をしたいという場合の判定方法です。

[ADSI] IADsGroup.IsMember メソッドを使ってユーザが特定のグループに所属してるかチェックしてみよう (VBScript / .NET Framework) というサイトが非常に参考になりました。
というか、答えがそのままコード付きで載せられています。(C#のコードもあるのもうれしいです。)

ということで、ほぼ参考先コードまるままですが、VBScriptでの判定方法です。
ローカルグループとドメイングループの判定をしています。

Option Explicit
 
'グループに所属しているかどうかをチェックするスクリプト
Dim comInfo , currentUser , domaingroup ,localgroup
 
Set comInfo = CreateObject("WinNTSystemInfo")
currentUser = comInfo.DomainName + "/" + comInfo.UserName
Set currentUser = GetObject("WinNT://" + currentUser + ",user")
 
'ローカルグループに属しているかの判定
Set localgroup = GetObject("WinNT://" + comInfo.ComputerName + "/Administrators,group")
Wscript.Echo currentUser.AdsPath
If localgroup.IsMember(currentUser.ADsPath) Then
WScript.Echo "ローカルAdministratorsに所属しています"
Else
WScript.Echo "ローカルAdministratorsに所属していません"
End If
 
'ドメイングループに属しているかの判定
Set domaingroup = GetObject("WinNT://ドメイン名/testu")
If domaingroup.IsMember(currentUser.ADsPath) Then
WScript.Echo "ドメインtestuグループに所属しています"
Else
WScript.Echo "ドメインtestuグループに所属していません"
End If

[PR]
by jehoshaphat | 2011-07-10 21:40 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
バッチファイルをプロンプトを表示せずにバックグラウンドで実行したい
バッチファイルをタスクに仕込んで、一定間隔置きにバックグラウンドで実行するよう設定しました。
しかし、バッチファイルは実行時にプロンプト画面を表示してしまうので、ウィンドウを表示させないようにしたいという要件です。

その場合、WSH(VBScript)で、WshShell.Run メソッドで、第二引数を0にしてバッチファイルを起動するようにしてしまえば、プロンプロトを表示せずにバッチが実行できるようです。
Set WshShell = WScript.CreateObject("WScript.Shell")
'バッチ非表示実行(エラーコードも取得)
Return = WshShell.Run("C:\test.bat", 0, true)


参考:
Windowsのバッチプログラム(.bat)を実行する際、ウィンドウを表示しない方法をお教えください。- 人力検索はてな
MSDN:WshShell.Run メソッド
[PR]
by jehoshaphat | 2011-02-22 22:59 | 豆知識 | Trackback | Comments(2)
ネットワークプレースを作成するVBScript
Windowsにはネットワークプレースと呼ばれる特殊フォルダあります。
(XPのヘルプを見る限り、マイクロソフトの意図としてはFTPやWEBDavをExplorerで扱いやすくするために作られたようですが、実際は共有フォルダへのリンク先となっているのがほとんどですよね。)
共有フォルダのネットワークプレースを作成すると、何かのアプリケーションでフォルダツリーから共有フォルダを選ばないといけない時でも、いちいちマイネットワークからツリーを展開してホストを指定して共有フォルダを選択して、、といった面倒なことをしなくて済みます。
(XPだとデフォルトでマイネットワーク直下にネットワークプレースが作成されます。また、自動的にできることもあります)


さて、PC台数が多いときにログインスクリプトとかで簡単に任意のネットワークプレースを作成する方法を調査してました。

まずはこのネットワークプレースと呼ばれる特殊フォルダの仕組みについてです。


ネットワークプレースの構成は通常のフォルダ配下に desktop.ini と target.link というショートカットがあるだけです。
target.linkはネットワークプレースのリンク先へのショートカットとなっています。
desktop.iniは下記のような内容となっています。

[.ShellClassInfo]
CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
Flags=2

上記の0AFACED1-E828-11D1-9187-B532F1E9575Dは「フォルダショートカット」と呼ばれる COM クラスで、通常のショートカットをフォルダとして名前空間の一部に割り付ける機能があるようですね。
この機能を使って、ネットワークプレースはフォルダツリー可能なショートカットとなっているわけですね。
(ただあくまでショートカットなので、シンボリックリンク(ジャンクション)と異なり、リンク先のアドレスは、実際の共有フォルダのUNCとなります。)
これで、desktop.ini のファイル属性をシステムファイルかつ隠しファイルにし、desktop.iniの親フォルダの属性を読取専用にすると、あら不思議、エクスプローラから見るとネットワークプレースとして見えるわけです。


構造さえ分かれば作成するのは簡単ですね。
本題のネットワークプレースを作成するVBScript(WSH)は下記のような感じとなります。(文字数の制限でハイライトはOFFです。)

'ネットワークプレース名
NetPlaceName = "給与_共有フォルダ"
'ネットワークプレースのリンク先共有フォルダ
NetPlacePath = "\\サーバ名\共有フォルダ名"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oWSHShell = CreateObject("Wscript.Shell")

'-------フォルダ作成(ネットワークプレースになるフォルダ)-------
'このスクリプトを実行したパスに、ネットワークプレースを追加する。
ShPath = objFSO.CreateFolder(".\" & NetPlaceName)
'例えばデスクトップ上に作りたい時とかはこうする
'DeskTop = oWSHShell.SpecialFolders("Desktop")
'ShPath = objFSO.CreateFolder(DeskTop & "\" & NetPlaceName)

'-------Desktop.iniの作成-------
'Desktop.iniファイル作成しネットワークプレース用のCOMクラス定義
Set oLog = objFSO.CreateTextFile( ShPath & "\Desktop.ini" )

'Desktop.iniファイルのCOMクラス定義文字列
strCOM = "[.ShellClassInfo]" & vbCrLf & _
"CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}" & vbCrLf & _
"Flags=2"

'Desktop.iniにCOMクラス定義文字列出力
oLog.WriteLine(strCOM)
oLog.Close()
Set oLog = Nothing

'-------ショートカット(target.link)の作成-------
Set oShell = CreateObject("Shell.Application")
Set oShortcut = oWSHShell.CreateShortcut(ShPath & "\target.lnk")
'ショートカット先を指定
oShortcut.TargetPath = NetPlacePath
'ショートカット保存
oShortcut.Save
Set oShell = Nothing


'-------Desktop.iniとフォルダの属性変更-------
'Desktop.iniのファイル取得
Set file = objFSO.GetFile(ShPath & "\Desktop.ini")
'Desktop.iniが隠しファイルじゃないなら隠しファイル属性付与
If file.Attributes = file.Attributes AND 2 Then
file.Attributes = file.Attributes XOR 2
End If
'Desktop.iniがシステムファイルじゃないならシステムファイル属性付与
If file.Attributes = file.Attributes AND 4 Then
file.Attributes = file.Attributes XOR 4
End If

'フォルダ取得(ネットワークプレースになるフォルダ)
Set folder = objFSO.GetFolder(ShPath)
'フォルダ自身が読み取り専用じゃないなら読取専用属性付与
If folder.Attributes = folder.Attributes AND 1 Then
folder.Attributes = folder.Attributes XOR 1
End If

Set objFSO = Nothing


参考:
フォルダリンクを利用する - Entering Passive Mode ネットワークプレースをはじめとした特殊フォルダの説明です。
Ken's Memo: Windows のネットワークプレースを複数マシンで共有する ネットワークプレースを複数PCでコピーした後、一気にファイル属性を変更しネットワークプレース化するスクリプトが載せられています。
謎のフォルダショートカットを調べて - seraphyの日記
VBScript ランゲージ リファレンス - Attributes プロパティ
[PR]
by jehoshaphat | 2011-02-10 22:42 | 豆知識 | Trackback | Comments(0)