タグ:バッチファイル ( 19 ) タグの人気記事
(バッチ)今のユーザが任意のグループに属しているか調べる
バッチファイルを実行するユーザが、任意のローカルもしくはドメインのグループに属しているかを調べる方法です。
以下のようにすることで、調べることができます。

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)
バッチファイルで再起動
バッチファイルで再起動をする方法ですが、shutdownコマンドを使えばOKです。

下記のようにバッチ実行時に確認を取るようにしています。


@echo off
echo "再起動を実行しますか? yes/no"
set /p FLG="y か n を入力:"
 
if "%FLG%"=="y" (goto :LBL_REBOOT)

if "%FLG%"=="Y" ( goto :LBL_REBOOT)
 
exit
 

:LBL_REBOOT
shutdown /r /f /t 15 -c "再起動を行います。"


実行には管理者権限が必要になるので、 (.Net)別ユーザでプロセスを起動するなどを参考にして、別ユーザで動かすexeをはさむといいでしょう。


参考:
コマンドラインから電源オフや休止を実行する - @IT
[PR]
by Jehoshaphat | 2011-10-27 23:43 | 豆知識 | Trackback | Comments(0)
WindowsPCのIPアドレスをコマンドプロンプト,バッチファイルで簡単設定
WindowsPCで現在のIPの設定をテキストに保存・読み込みする ではIP設定をnetshをつかってエクスポート・インポートする方法を書きましたが、今回は netsh コマンドで手動でIPアドレス情報を設定する方法をまとめてみました。

コマンドプロンプトからIPアドレス・サブネットマスク・デフォルトゲートウェイ・DNSサーバを設定するには、下記のように設定します。

IPアドレスの設定
netsh interface ip set add name="ローカル エリア接続" source=static addr=192.168.0.10 mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1

プライマリDNSサーバの設定
netsh interface ip set dns name="ローカル エリア接続" source=static addr=192.168.0.2 register=non

セカンダリDNSサーバの設定
netsh interface ip add dns name="ローカル エリア接続" addr=192.168.0.3 index=2

DHCPにするには、 source=static を source=dhcp にします。


次にバッチファイルです。変数を使うことで使い回しがしやすいようしてるだけです。


@echo off
 
rem ネットワークアダプタ名
set Ntname="ローカル エリア接続 2"
rem 固定で割当てるIPアドレス
set Ipadd=192.168.0.10
rem サブネットマスク
set Subnet=255.255.255.0
rem デフォルトゲートウェイ
set Dfgy=192.168.0.1
rem DNSサーバ1
set DnsSv1=192.168.0.1
rem DNSサーバ2
set DnsSv2=192.168.0.2
echo 固定IPアドレス設定中。しばらくお待ちください...
rem IPアドレス,サブネットマスク、デフォルトゲートウェイ設定
netsh interface ip set add name=%Ntname% source=static addr=%Ipadd% mask=%Subnet% gateway=%Dfgy% gwmetric=1
rem DNSサーバプライマリを設定
netsh interface ip set dns name=%Ntname% source=static addr=%DnsSv1% register=non
rem DNSサーバセカンダリを設定
netsh interface ip add dns name=%Ntname% addr=%DnsSv2% index=2
 
rem DHCPにしたいときは下記のようにします。
rem netsh interface ip set dns name=%Ntname% source=dhcp register=non
rem netsh interface ip set add name=%Ntname% source=dhcp
 
echo 固定IPアドレスを設定しました。何かキーを押して終了してください。
pause


さて、ここで面倒なのは netsh の指定時にネットワークアダプタ名(ネットワークインターフェイス名、NIC名)を指定しないといけないということです。
これが環境によって違ったり複数NICあったりする場合もするんですよね。

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

詳しくは 次の記事 に書きたいと思います。

参考:
netsh interface ipコマンドでIPアドレスを設定する - 管理者必見! ネットワーク・コマンド集:ITpro
IPアドレスの設定:
[PR]
by jehoshaphat | 2011-08-11 12:20 | ネットワーク | Trackback | Comments(1)
バッチファイルをプロンプトを表示せずにバックグラウンドで実行したい
バッチファイルをタスクに仕込んで、一定間隔置きにバックグラウンドで実行するよう設定しました。
しかし、バッチファイルは実行時にプロンプト画面を表示してしまうので、ウィンドウを表示させないようにしたいという要件です。

その場合、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)
バッチファイルでUNCをカレントディレクトリにしたい

共有フォルダ上に配置するバッチファイルから、相対パス指定で同じフォルダにあるexeを呼び出す処理が必要になりました。

で、バッチファイルに当初下記のように書いていました。


cd %~dp0
test.exe
pause


そうすると下記のようにUNCパスは使えないって怒られます。

CMD では UNC パスは現在のディレクトリとしてサポートされません。


で、調べた結果初めて知ったんですが、Windowsには pushd というコマンドもあるようです。

pushd コマンドは cd コマンドと同じようにカレントフォルダを移動するコマンドなんですが、違いはスタックでカレントフォルダの履歴を残すことです。そして、popd コマンドでひとつ前のフォルダに移動することができます。
これは非常に便利ですね。

この pushd コマンドですが、もう一つうれしい機能があり、それは UNC をカレントディレクトリにしようとすると適当な空きドライブに対して、ネットワークドライブを設定し、そのドライブに移動してカレントフォルダを指定してくれるようです。
つまり、UNCパスが使えるということですね。

ということで共有フォルダ上のバッチファイルを下記のように変更すればうまくいきました。

pushd %~dp0
test.exe
pause



参考:
ネットワークドライブでのバッチファイルの実行 - ULog
pushd/popdでフォルダを移動する - @IT
共有フォルダ上のバッチファイルのカレントパスはどこになる?
[PR]
by jehoshaphat | 2010-10-24 21:44 | 豆知識 | Trackback | Comments(1)
cacls.exe を使ってACL(NTFSアクセス権)を設定中に データが無効です と言われる

(cacls.exe を使ったACL(NTFSアクセス権)設定はcacls.exe を使ってACL(NTFSアクセス権)を設定するを参照)

cacls.exe を使った下記のようなバッチファイルで、テスト実行をしていたんですが、実行時に「データが無効です。」というメッセージが出てきます。

バッチファイル名:test.bat
rem @echo off
cd /d %~dp0
rem アクセス権設定 (第一引数にユーザ名があるとする)
cacls.exe "\\filesv\user\%1" /E /T /G "hogedomain\%1":C

実行時は下記のようにしてます。

>test.bat userA

ファイルサーバ上の個人フォルダに対して変更権限を持たすというものです。

で、いろいろ調査した結果、ACL適用先フォルダに既にuserAに対するフルコントロールが与えられてました。
どうやら、既にアクセス権を持っているのに、/G で既に設定されているより弱いアクセス権追加しようとすると、「データが無効です。」と表示される仕様のようです。
この不親切なメッセージで数時間潰されましたよ。。。
[PR]
by jehoshaphat | 2010-10-23 10:10 | 豆知識 | Trackback | Comments(0)
バッチファイルでコマンドライン引数(パラメタ)を参照する

バッチファイルで、実行時のコマンドライン引数(パラメータ)を取得する方法です。

%1 で引数一つ目、%2 で引数二つ目という感じで取得できます。
%* とすると、全ての引数を取得できます。
%0 とすると、実行したコマンド文字列自体を取得できます。


で、この引数ですが修飾子を付けることで目的の文字列にできるようです。
代表的に下記のような修飾子があるようです。(下記は一番の引数を対象にした場合)
%~1 : 二重引用符(")で囲んでいる場合、それを除去する
%~f1 : 絶対パスに変換。
%~d1 : ドライブ名取得
%~p1 : フォルダ部分のパス取得。
%~n1 : ファイル名取得。
%~x1 : 拡張子取得。
%~t1 : ファイルの日付・時刻に展開。
%~z1 : ファイルサイズ取得。
これらの修飾子は組み合わせることも可能です。
(例えば、こちらの記事のコメントと追記で書いている %^dp0 はコマンド自体(%0)にバッチファイルのフルパスが入るので、それのフォルダパスを取得して、カレントディレクトリにしましょ ということになるようです。)
その他の修飾子はEZ-NET: Windows コンソール プログラミング - バッチファイルの引数を操作するコマンドプロンプトを使ってみよう! -バッチファイルとは?が参考になります。

補足ですが、%0 にバッチファイルのパスが入っていることを利用してバッチの起動ファイルパス、起動ディレクトリを表示することも可能です。
例えば下記のようなバッチとします。

@echo off
echo 実行したバッチのパス表示(バッチファイル名含む)
echo %~f0
echo 実行したバッチのパス表示(バッチファイル名含ない)
echo
%~d0%~p0
pause

バッチファイルを D:\test\a.bat に保存して実行すると結果はこうなります。

実行したバッチのパス表示(バッチファイル名含む)
D:\test\aaaa.bat
実行したバッチのパス表示(バッチファイル名含ない)
D:\test\

また、バッチファイルを \\server01\test\a.bat に保存して実行すると結果はこうなります。

実行したバッチのパス表示(バッチファイル名含む)
\\server01\test\aaaa.bat
実行したバッチのパス表示(バッチファイル名含ない)
\\server01\test\


ちなみに、%ERRORLEVEL% とすると、直前のコマンドの返り値を取得できることは、ここでも書いてます。
(ダブルクォーテーションの中で書いても展開してくれるようですね。)

参考:
バッチメモ(Hishidama's bat-file Memo)
[PR]
by jehoshaphat | 2010-10-23 10:01 | 豆知識 | Trackback | Comments(0)