「ほっ」と。キャンペーン
カテゴリ:VBScirpt,WSH,バッチ( 13 )
(バッチ)メッセージボックスを表示したい
バッチファイル実行時に、ユーザに重要な情報を伝えたい時に、コマンドプロンプト画面内での表示ではインパクトが薄いのでメッセージボックスで表示したいと思いました。

以下のようにすれば、それが可能なようです。
echo "テストです" | msg 0

/w をつけると、OKボタンを押さないと次の処理に進まなくできるようです。
echo "OKボタンを押してください" | msg 0 /w


参考:
MSGコマンドを使ってコマンドプロンプトやバッチファイルからメッセージボックスを出す。
batファイルでメッセージを出す方法 これは一旦VBSファイルにリダイレクトする方法を使ってます
[PR]
by jehoshaphat | 2014-02-14 01:05 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(バッチ)32bitか64bitか判断する
バッチファイルで、今バッチを実行しているOSがx86(32bit)なのかx64(64bit)なのか判断したいと思いました。
で、ググると、バッチファイルで64ビットと32ビット違うコマンドを実行するにドンピシャな情報が。。

コピペですが、以下のバッチで判断できるようです。


@echo off
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" (
echo "x86"
)
if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
echo "x64"
)
pause

[PR]
by jehoshaphat | 2014-02-14 01:00 | VBScirpt,WSH,バッチ | Trackback | Comments(1)
(バッチ)今のユーザが任意のグループに属しているか調べる
バッチファイルを実行するユーザが、任意のローカルもしくはドメインのグループに属しているかを調べる方法です。
以下のようにすることで、調べることができます。

rem ローカルのAdministratorsグループに属しているか
net localgroup Administrators | find /I "%USERNAME%"
if %ERRORLEVEL% == 0 (
echo "属してる"
) else (
echo "属してない"
)
 
rem ドメインの Domain Admins グループに属しているか
net user "%USERNAME%" /domain | find /I "*Domain Admins"
if %ERRORLEVEL% == 0 (
echo "属してる"
) else (
echo "属してない"
)


当初は、ドメインの任意のユーザがこのバッチを実行したPCのローカルの管理者(Administrators)かどうかを調べたいと思っていました。
ローカルのAdministratorsグループに、直にドメインのユーザを指定している場合は上記の方法で取得できました。
しかし、ローカルのAdministratorsグループにドメインのグループを指定しており、そのドメイングループにユーザが所属しているとかいう場合は上記の方法だけでは判定できません。
そのような場合、ローカルのAdiministaratorsグループ内のドメインメンバを列挙し、ユーザがそのドメイングループにいるかどうかを調べる必要があります。
が、バッチだとそのあたりの処理の実装が難しいので、断念しました。

やはりちょっと複雑になるような処理はVBScriptやプログラムにしてしまったほうが楽です。


ドメインユーザがローカルのAdministratorsグループに属しているかどうかは、whoami コマンドを使うといいようです。
ただ、whoami コマンドはVsita以降は標準で着いてますが、2000はリリースキット、XP SP2のサポートツールいれないと使えないようです。

whoami /groups | find /I "Administrator"
if %ERRORLEVEL% == 0 (
echo "ローカル管理者権限有り"
) else (
echo "ローカル管理者権限なし"
)


参考:
ユーザが管理者権限を有しているかバッチで判定する方法 - Windows Server Insider - @IT
Windows Server:システム管理者の視点 - 正式に認められた「Whoami」コマンド:ITpro
[PR]
by Jehoshaphat | 2013-03-24 22:25 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(バッチ)OSのバージョンとサービスパックの有無を調べる

バッチファイルで、Windowsのバージョンと、サービスパックの情報を取得する方法です。

幾つか方法はあるかと思いますが、Windowsのバージョンの取得判定はWindowsのバージョン毎に処理を分岐させる [コマンドプロンプト] - Diary on windを参考にさせてもらいました。
WindowServer2003以降は ver コマンドではWindowsということしかわからない様で、systeminfo コマンドを使って調べてるようです。
(しかし、systeminfoコマンドはちょいと重いのであまり使いたくはないんですよね。。)


@echo off
 
rem Windowsのバージョンチェック
SETLOCAL ENABLEEXTENSIONS
VER|FIND "NT">NUL
IF %ERRORLEVEL% EQU 0 GOTO WINNT
 
VER|FIND "2000">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K
 
VER|FIND "XP">NUL
IF %ERRORLEVEL% EQU 0 GOTO WINXP
 
IF NOT EXIST %SystemRoot%\System32\systeminfo.exe GOTO WARN
FOR /F "tokens=2 delims=," %%A IN ('%SystemRoot%\System32\systeminfo.exe /FO CSV /NH') DO SET osvers=%%A
 
ECHO %osvers%|FIND "Server 2003">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K3
 
ECHO %osvers%|FIND "Windows Vista">NUL
IF %ERRORLEVEL% EQU 0 GOTO WINVISTA
 
ECHO %osvers%|FIND "Server 2008">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K8
 
ECHO %osvers%|FIND "Windows 7">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN7
GOTO WARN
 
rem 各OS別の処理
:WINNT
ECHO Windows NT
GOTO :EOF
 
:WIN2K
ECHO Windows 2000
GOTO :EOF
 
:WINXP
ECHO Windows XP
GOTO SP_CHK
 
:WIN2K3
ECHO Windows 2003
GOTO SP_CHK
 
:WINVISTA
ECHO Windows Vista
GOTO SP_CHK
 
:WIN2K8
ECHO Windows 2008
GOTO SP_CHK
 
:WIN7
ECHO Windows 7
GOTO SP_CHK
 
:WARN
ECHO Unknown Windows version
GOTO SP_CHK
 
 
rem サービスパックのチェック
:SP_CHK
 
FOR /F "TOKENS=1,2,*" %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "CSDVersion"') DO IF "%%A"=="CSDVersion" SET SPVER=%%C
echo %SPVER%
 
 
pause


サービスパックに関しては、レジストリから取得しています。
これ以外にも、wmic os get csdversion を使う方法があります。
以下のような感じです。

set SP_NAME=
set SP=
for /F "delims=" %%v in ('wmic os get csdversion') do set SP=%%v
 
ECHO %SP%|FIND "Service Pack 1">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP1
 
ECHO %SP%|FIND "Service Pack 2">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP2
 
ECHO %SP%|FIND "Service Pack 3">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP3



また、systeminfoからサービスパック情報も取得できますね。

IF NOT EXIST %SystemRoot%\System32\systeminfo.exe GOTO WARN
FOR /F "tokens=3 delims=," %%A IN ('%SystemRoot%\System32\systeminfo.exe /FO CSV /NH') DO SET osvers=%%A
 
echo %osvers%
 
ECHO %osvers%|FIND "Service Pack 1">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP1
ECHO %osvers%|FIND "Service Pack 2">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP2
ECHO %osvers%|FIND "Service Pack 3">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP3
 
echo %SP_NAME%



しかし、wmic も reg query でレジストリから取得する方法も、systeminfo も XP以上出ないと使えません。
Windows2000でもサービスパックのバージョンを調べようとすると、他の手立てを取る必要があります。
(バッチじゃなくVBScriptを使ったほうが良いかもしれません)


参考:
Windows XPでSPのバージョンを確認するバッチファイルを作成し - Windows XP - 教えて!goo
バッチファイル(~.BAT)の中でXPsp2とsp3を判定する方法を教えてください。 - Yahoo!知恵袋
[PR]
by Jehoshaphat | 2013-03-23 22:22 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(バッチ)レジストリの値を取得し変数に格納
バッチファイルで、レジストリの値を取得して変数に入れるための方法です。
レジストリからの値の取得は reg query コマンドで出来るようです。/v の後に、キーの名前を指定します。

例えばFlashPlayerのバージョンを取得するには以下のようにします。

C:\>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerActiveX" /v "Version"

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerActiveX
Version REG_SZ 11.0.1.152


これを変数に入れるためには、実行結果を行ごとにループで回し、求めたい値の名前(結果行の空白で区切った1番目(%%A)。今回はVersion)が出てきたら、その3番目(%%C。%%Aから3つ目)を GET_VALUE 変数に入れるという処理の流れにすればいいようです。
@echo off
 
FOR /F "TOKENS=1,2,*" %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerActiveX" /v "Version"') DO IF "%%A"=="Version" SET GET_VALUE=%%C
 
echo Flashバージョン
echo %GET_VALUE%
 
pause



参考:
レジストリの値をコマンド プロンプトで取得する こちらのコードをほぼそのまま使わせてもらいました。
@IT:コマンド・プロンプトでレジストリを操作する
コマンドプロンプトを使ってみよう! -バッチファイル-
[PR]
by Jehoshaphat | 2013-03-22 22:21 | VBScirpt,WSH,バッチ | Trackback | Comments(0)
(バッチ)ファイルフォルダの存在確認
バッチファイルで、ファイル・フォルダの存在確認を行う方法です。
EXIST で確認できるようですね。

参考先そのままですが、コードを掲載します。
SET filename="test.txt"
IF EXIST %filename% (GOTO FILE_TRUE) ELSE GOTO FILE_FALSE
 
:FILE_TRUE
ECHO "ファイルが見つかりました"
GOTO BAT_END
 
:FILE_FALSE
ECHO "ファイルが見つかりません"
GOTO BAT_END
 
:BAT_END

参考:
BATファイルでファイル、フォルダの存在確認
[PR]
by Jehoshaphat | 2013-03-21 22:19 | VBScirpt,WSH | Trackback | Comments(0)
(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)
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)