2009年11月11日
まず、実際の実行文です( バッチファイルの一部です )
※ ファイル名 : vsvars32.bat
:GetWindowsSdkDir
@call :GetWindowsSdkDirHelper HKLM > nul 2>&1
@if errorlevel 1 call :GetWindowsSdkDirHelper HKCU > nul 2>&1
@if errorlevel 1 set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\
@exit /B 0
:GetWindowsSdkDirHelper
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\Microsoft SDKs\Windows" /v "CurrentInstallFolder"') DO (
if "%%i"=="CurrentInstallFolder" (
SET "WindowsSdkDir=%%k"
)
)
@if "%WindowsSdkDir%"=="" exit /B 1
@exit /B 0
最初、call GetWindowsSdkDirHelper HKLM でバッチファイル内のサブルーチンを呼び出しています。HKLM は引数ですが、> nul 2>&1 は、全ての出力がnul にリダイレクトされて、何も表示させないという事です。2>&1 の記述は直前の出力に標準エラー出力をリダイレクトすると言う意味です。
次に、サブルーチン内は For /F でコマンドの出力結果を一行づつ読みだしてループ処理をする構文ですが、コマンド内の reg の結果は以下のようになります
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows
CurrentInstallFolder REG_SZ C:\Program Files\\Microsoft SDKs\Windows\v6.0A\
特別なオプションが無いので、行が空白で区切って取り出されて%i に最初のトークン、%j に次のトークン、残り全てが %k にセットされます。
結果的に "%%i"=="CurrentInstallFolder" に一致する行よりC:\Program Files\\Microsoft SDKs\Windows\v6.0A\ が環境変数にセットされます。( この時点で exit /B 0 できるはずですが、テストはしていません )
最後に結果を示す値が errorlevel にセットされて返ります
つまり、HKLM で発見できなければ、HKCU で再度実行し、それでも発見できない場合、set WindowsSdkDir=%VCINSTALLDIR%\PlatformSDK\ が実行されます
関連する記事
posted by
lightbox at 2009-11-11 10:18
|
コマンド : バッチファイル
|

|
2009年09月12日
%~nx0 は、call コマンドの引数を展開する変数です
( ここでは、vtest.bat になります )
よくよく見ると、展開される内容を意味する一文字が使われています。
x = > extension
z => size
s => short name
@echo off
for %%i in ( %~nx0 ) do (
echo ~ : そのまま : %%~i
echo ~f : フルパス : %%~fi
echo ~d : ドライブ : %%~di
echo ~p : パス : %%~pi
echo ~n : 名前 : %%~ni
echo ~x : 拡張子 : %%~xi
echo ~s : 短い名前 : %%~si
echo ~a : 属性 : %%~ai
echo ~t : タイムスタンプ : %%~ti
echo ~z : サイズ : %%~zi
echo ~dp : 結合 : %%~dpi
)
関連する記事
laylaClass バッチ処理支援パッケージ
posted by
lightbox at 2009-09-12 13:00
|
コマンド : バッチファイル
|

|
2009年08月30日
@echo off
if "%1" == "" (echo コマンド番号を指定して下さい & goto end)
if "%1" == "0" (echo 番号は1以上です & goto end)
call :ErrorCheck %1 %~dp0_list.bat 2> null
if "%ERRORLEVEL%" == "1" (goto end)
for /F "delims= skip=%1" %%i in (%~dp0_list.bat) do (
%%i
goto end
)
REM サブルーチン用エリアを作る為の JUMP
goto end
REM ループ処理の事前エラーチェック
:ErrorCheck
call :setErrorLevel 1
for /F "skip=%1" %%i in (%2) do (call :setErrorLevel 0)
if "%ERRORLEVEL%" == "1" (echo パラメータが不正です)
exit /B
REM errorlevel 設定用
:setErrorLevel
exit /B %1
REM 終了
:end
ERRORLEVEL を判断用に使う為に( 汎用性のため )
setErrorLevel というサブルーチンを作成しています。
FOR のパラメータに不正があると、do を実行しないので、
ERRORLEVEL が設定されたかどうかでエラーを判断します。
FOR が出力する標準エラー出力は直接取得できないので、
サブルーチン化して FOR の出力するエラーメッセージを抑制しています
関連する記事
バッチファイルで、ファイルの中の行を指定してその行の文字列を実行する
posted by
lightbox at 2009-08-30 21:31
|
コマンド : バッチファイル
|

|
listexec.bat
@echo off
if "%1" == "" (echo コマンド番号を指定して下さい & goto end)
if "%1" == "0" (echo 番号は1以上です & goto end)
for /F "delims= skip=%1" %%i in (%~dp0_list.bat) do (
%%i
goto end
)
echo リストの最大値を超えています
:end
_list.bat
@echo off
dir "C:\user"
dir "C:\Documents and Settings\lightbox\My Documents\My Pictures"
dir "C:\Documents and Settings\lightbox\Local Settings\Temp"
dir "C:\Documents and Settings\lightbox\SendTo"
dir "C:\Documents and Settings\lightbox\Favorites"
listexec.batと_list.bat を同じディレクトリに置いて実行します
例 : listexec 1
例 : listexec 5
listexec や listexec 6 はエラーになります
_list.bat を一連の JOB として考えると、for の中の goto end を削除する事によって、
どこか途中からやりなおす、というような使い方が可能です
( その場合、for から出た後のメッセージを変更する必要があります )
posted by
lightbox at 2009-08-30 20:27
|
コマンド : バッチファイル
|

|
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。
Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。
また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。
※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです
対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。
※ エキスパートモードで表示しています
アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります
<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>
<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>
<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します