SQLの窓

2018年06月26日


バッチファイル(コマンドプロンプト)で使用できる特殊な3つの環境変数



昔、Windows の ヘルプとサポートセンターで コマンドシェル で検索すると、コマンドシェルの概要 というのがリストの中に出てきました。
1) %CD%
2) %ERRORLEVEL%
3) %RANDOM%
当然バッチファイル内でのプログラミング目的です。環境変数は、コマンド内で置き換えられてそのまま実行されるので以下のような使い方ができるので便利です
title ユーザーコマンドプロンプト / %cd%
これは、コマンドプロンプトのタイトルに現在のディレクトリを表示します。 cur.bat(laylaClass バッチ処理支援パッケージ) の中身です。 例えばユーザ変数に現在のカレントディレクトリへ戻るコマンドをセットします
set ROOT=cd %CD%
その後(同じドライブであれば)、cd コマンドであちこち移動しても %ROOT% と実行すれば、元に返ってこれます ※ 初期投稿 : 2009-08-28 17:56:27
posted by lightbox at 2018-06-26 16:12 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2018年03月07日


バッチファイル内で、コマンドプロンプトが管理者権限で実行されているかのチェック

Windows10用WinHlp32.exeインストールバッチファイル というものを見つけて、Windows10 で実行してうまく行ったので、バッチファイルを読んでみたら面白い処理があったので、環境変数を使わないパターンで整理してみました。

@echo off

:check1
for /f "tokens=1 delims=," %%i in ('whoami /groups /FO CSV /NH') do (
	if "%%~i"=="BUILTIN\Administrators" goto :check2
)

echo 管理者グループではありません
goto :end

:check2
for /f "tokens=1 delims=," %%i in ('whoami /groups /FO CSV /NH') do (
	if "%%~i"=="Mandatory Label\High Mandatory Level" goto :admin
)
echo 管理者権限で実行してください
goto :end

:admin

echo 管理者権限で実行しています

:end

/f はファイルを読み込んだりするスイッチですが、コマンドの実行結果も使えるので、ここでのコマンドは whoami です。

引数の /groups /FO CSV /NH は、実行中のユーザが属するグループの一覧を CSV 形式で タイトルヘッダー無しで表示という意味です。

"tokens=1 delims=," は、CSV 形式なので、カンマで分解して先頭の文字列を使うという意味で、結果が %%~i に入るので文字列としてチェックする為に " で挟んで右辺と比較しています。

二つの条件を両方満たしたら、管理者グルーブのユーザが管理者権限で実行している事になります。 

管理者権限のチェックはそれほど重要ではありませんが、バッチファイルでどうしてもいろいろ分岐したい場合に使われるテクニックで、コマンドの結果で判断できるので、レジストリの内容を REG QUERY で取り出して利用も可能です。


※ 管理者権限でないと、High Mandatory Level では無く、Medium Mandatory Level でした。


posted by lightbox at 2018-03-07 17:27 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2017年05月20日


デスクトップのアイコン表示を切り替えるバッチファイル

デスクトップを右クリックして表示されるポップアップメニューの、『表示』サブメニューから、『デスクトップアイコンの表示』で切り替える事ができる機能をコマンドプロンプトから可能にします

di.bat
@echo off
cmd "/c echo set o=CreateObject("Shell.Application"):Set osw=o.Windows:Set oie=osw.Item:oie.Document.FolderFlags=CLng(oie.Document.FolderFlags) Xor ^&H00001000 > %TEMP%\_.vbs & wscript.exe %TEMP%\_.vbs"

echo コマンドで、vbscript のコードをテンポラリフォルダに作成して実行するという手法を用いています。

関連する記事

PATH 環境変数の内容をパス毎に改行して表示する pathx.bat ファイルの内容
管理者権限のコマンドプロンプトを開くバッチファイル
バッチファイル : クリップボードからデータを読み込んで表示

VBScript のコード
Set Shell = CreateObject( "Shell.Application" )

Set objShellWindows = Shell.Windows

Set objIE = objShellWindows.Item

objIE.Document.FolderFlags = CLng(objIE.Document.FolderFlags) Xor &H00001000

1) Shell.Application
2) ShellWindows
3) ShellWindows.Item
4) InternetExplorer
5) FOLDERFLAGS enumeration

※ 結局のところ、IE の Document と FolderFlags の関係を記したドキュメントは見つける事ができていません。

Windows 10 でも動作します。また、VBScript のコードをどこかに保存して(di.bat のままだと、コマンドウイドウが一瞬表示されてしまうので)、Wscript で実行するショートカットを作成して、『新規ツールバー』を作成して登録すれば、Quick Launch として使用可能です。







posted by lightbox at 2017-05-20 14:29 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2014年11月10日


バッチファイルで、二つのファイルが同じファイルかどうかチェックして if errorlevel で処理を分岐する

※ バイナリでファイルの比較は、FC.EXE で行います。
※ 引数にファイル名を二つ渡します( どちらも拡張子は .txt という前提で省略しています )
※ cmd001.bat というファイルが残りますが、必要なら削除します
※ 先頭で、引数を拾ってコマンドを作成する必要があります

先頭で作成されるファイル(cmd001.bat)の中身は以下のようになります
@echo off 
fc /b 001.txt 002.txt 
これを 26行目 で実行して、その結果の文字列によって処理を分岐します
@echo off
echo @echo off > cmd001.bat
echo fc /b %1.txt %2.txt >> cmd001.bat
REM ***********************************************
REM コマンドの先頭の @ は、そのコマンドの表示を抑制
REM echo off は以降のコマンドの表示を抑制
REM ***********************************************

REM ***********************************************
REM サブルーチンの呼び出し
REM ***********************************************
call :GetFC
if errorlevel 1 ( Call :CheckOk ) else ( Call :CheckErr )

REM ***********************************************
REM 処理の終わり
REM ***********************************************
goto end



REM ***********************************************
REM サブルーチン
REM ***********************************************
:GetFC
for /F "delims=: tokens=2" %%i in ('call cmd001.bat') do (
	if "%%i"==" 相違点は検出されませんでした" (
		exit /B 1
	)
)
exit /B 0

:CheckOk
echo ファイルは一致しました
echo 作業を続けて下さい
exit /B

:CheckErr
echo ファイルは一致しませんでした
echo 作業を中止して下さい
exit /B


REM ***********************************************
REM 記述の終わり
REM ***********************************************
:end


関連する記事

バッチファイル内の Call コマンドによるサブルーチンの呼び出し


posted by lightbox at 2014-11-10 14:57 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2014年09月27日


バッチファイル内の Call コマンドによるサブルーチンの呼び出し( errorlevel を戻して if で判断する )

コマンドプロントの拡張機能である、ラベルによる呼び出しは、デフォルトで有効になっています
CALL :ラベル 引数
以下に引数errorlevel を使用したサンプルを示します
@echo off
REM ****************************************
REM コマンドの先頭の @ は、そのコマンドの表示を抑制
REM echo off は以降のコマンドの表示を抑制
REM ****************************************

REM ****************************************
REM サブルーチンの呼び出し
REM ****************************************
call :GetDay 09
if errorlevel 1 ( 
	echo 現在の月は引数と一致しました & date /T
) else ( 
	echo 現在は引数以外の月です & date /T
)

REM ****************************************
REM 処理の終わり
REM ****************************************
goto end



REM ****************************************
REM サブルーチン
REM date /t で 2009/08/16 というような表示を / で区切り
REM 2番目の 08 を %%i へセットする
REM ****************************************
:GetDay
@for /F "delims=/ tokens=2" %%i in ('date /t') do (
	REM 現在が引数と一致する場合
	if "%%i"=="%1" (
		REM サブルーチンからの脱出と同時に errorlevel のセット
		exit /B 1
	)
)
REM 一致しなかった場合のサブルーチンからの脱出
exit /B 0

REM ****************************************
REM 記述の終わり
REM ****************************************
:end



REM ****************************************
REM 【補足】
REM
REM date /t の /t と call :ラベルは何れもデフォルトで有効な
REM コマンド拡張機能 です。
REM ****************************************

要点

:GetDay にジャンプして、exit コマンドで元へ戻ります。
exit /B で cmd.exe を終了するのでは無く制御を call の呼び出し元へ移します
exit /B 数値 によって、結果を戻り値として返します

if や else の結果で複数コマンドを実行したい場合は & でつなげます。
( if文は キーワードが行の先頭になければ複数行で記述できますが、コマンドは & でつなげる場合1行で記述する必要があります )


関連する記事


posted by lightbox at 2014-09-27 13:54 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2014年06月20日


あらかじめ指定しておいたフォルダの中を探して Excel のドキュメントを開くバッチファイル

s_excel 経費.xlsx と実行します。そうすると、

C:\Users\lightbox\Downloads
と
C:\Users\lightbox\Desktop\作業
の中から探して開いてくれます

結局、ファイルしか指定していないので、アプリケーションと関連付けされているファイルならなんでも使えます。


s_excel.bat
@echo off
setlocal
set THIS=C:\Users\lightbox\Downloads;C:\Users\lightbox\Desktop\作業

%~$THIS:1


関連する記事

バッチファイル自身をフルパスで展開する変数 : %~f0



posted by lightbox at 2014-06-20 13:22 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり