SQLの窓

2020年02月02日


バッチファイル内で、実行中のファイルと引数のファイルを扱う特殊変数



ほぼ、この扱いに関する説明は、コマンドプロンプトで for /? と入力すると表示されるものと同じです
また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:

    %~I         - すべての引用句 (") を削除して、%I を展開します。
    %~fI        - %I を完全修飾パス名に展開します。
    %~dI        - %I をドライブ文字だけに展開します。
    %~pI        - %I をパス名だけに展開します。
    %~nI        - %I をファイル名だけに展開します。
    %~xI        - %I をファイル拡張子だけに展開します。
    %~sI        - 展開されたパスは短い名前だけを含みます。
    %~aI        - %I をファイルの属性に展開します。
    %~tI        - %I ファイルの日付/時刻に展開します。
    %~zI        - %I ファイルのサイズに展開します。
    %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                   検索し、最初に見つかった完全修飾名に %I を
                   展開します。
                   環境変数名が定義されていない場合、または検索
                   してもファイルが見つからなかった場合は、この
                   修飾子を指定すると空の文字列に展開されます。
この中で I が for における変数の番号になりますが、バッチファイルでは、 0 が実行中のファイルで、1以降が引数の番号です。その内容を実際に実行する為に二つのバッチファイルを用意しました bat-params1.bat
@echo off
call bat-params2.bat php.exe cmd.exe "C:\Program Files"

pause


bat-params1.bat
@echo off
echo    %~0        
echo    %~f0       
echo    %~d0       
echo    %~p0       
echo    %~n0       
echo    %~x0       
echo    %~s0       
echo    %~a0       
echo    %~t0       
echo    %~z0       
echo    %~$PATH:1  
echo    %~$PATH:2  
echo    %3
echo    %~3

REM - すべての引用句 (") を削除して、%I を展開します。
REM - %I を完全修飾パス名に展開します。
REM - %I をドライブ文字だけに展開します。
REM - %I をパス名だけに展開します。
REM - %I をファイル名だけに展開します。
REM - %I をファイル拡張子だけに展開します。
REM - 展開されたパスは短い名前だけを含みます。
REM - %I をファイルの属性に展開します。
REM - %I ファイルの日付/時刻に展開します。
REM - %I ファイルのサイズに展開します。
REM - PATH 環境変数に指定されているディレクトリを
REM -  検索し、最初に見つかった完全修飾名に %I を
REM -  展開します。
REM -  環境変数名が定義されていない場合、または検索
REM -  してもファイルが見つからなかった場合は、この
REM -  修飾子を指定すると空の文字列に展開されます。



実行結果は以下のようになります
C:\Users\sworc\Downloads\create_name>bat-params1.bat
   bat-params2.bat
   C:\Users\sworc\Downloads\create_name\bat-params2.bat
   C:
   \Users\sworc\Downloads\create_name\
   bat-params2
   .bat
   C:\Users\sworc\DOWNLO~1\CREATE~1\BAT-PA~2.BAT
   --a--------
   2020/02/02 15:55
   1011
   C:\php\php.exe
   C:\Windows\System32\cmd.exe
   "C:\Program Files"
   C:\Program Files
続行するには何かキーを押してください . . .
C:\Users\sworc\Downloads\create_name>

このページの PDF


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

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 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり