カテゴリ:VBScirpt,WSH,バッチ( 13 )
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)