SQLの窓

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 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

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

param_check.bat
@echo off
setlocal
set THIS=%~dp0
echo ====================================
echo 一時環境変数(THIS):%THIS%

echo 入力された内容 : %~0
echo f : %~f0
echo d : %~d0
echo p : %~p0
echo n : %~n0
echo x : %~x0
echo s : %~s0
echo a : %~a0
echo t : %~t0
echo z : %~z0
echo 検索 : %~$THIS:0
実行結果
C:\user\lightbox\bat>param_check.bat
====================================
一時環境変数(THIS):C:\user\lightbox\bat\
入力された内容 : param_check.bat
f : C:\user\lightbox\bat\param_check.bat
d : C:
p : \user\lightbox\bat\
n : param_check
x : .bat
s : C:\user\lightbox\bat\PARAM_~1.BAT
a : --a------
t : 2014/06/20 12:58
z : 302
検索 : C:\user\lightbox\bat\param_check.bat
検索に使う環境変数は、通常は PATH 環境変数を使いますが、ここではテストの為にローカルで作成してカレントディレクトリをセットしています。 入力値がそのまま、%~0 に反映されるので、拡張子を省略しないでバッチファイルを実行させます。 修飾子を組み合わせて、複合結果を得る場合は、文字を重ねて利用可能です。 (ここでの例:set THIS=%~dp0) call /? ですべての説明が表示されます
%* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
    %5 など) を参照します。

バッチ パラメータ (%n) の置換は拡張されました。次のオプション構文
を使うことができます:

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

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dp1       - %1 をドライブ文字とパスだけに展開します。
    %~nx1       - %1 をファイル名と拡張子だけに展開します。
    %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                  検索して %1 を探し、最初に見つかったファイル
                  のドライブ文字とパスだけに展開します。
    %~ftza1     - %1 を DIR の出力行のように展開します。





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

2014年06月19日


バッチファイル : ファイル順のシャッフル

とりあえず、mp3 のシャッフルしか用途が思いつかないですが・・・。ま、何かに使えるでしょう。

?%%j==? の ? は、空白文字列の判断用で、ファイル名に使え無い文字を使っています。( %%j は、ファイル名なので )。別に "%%j"=="" でもいいのですが、"%%j"=="" の "" は言語的なものでは無いという事を忘れないようにというメモ的な意味もあります
@echo off
REM ******************************
REM シャッフルバッチ
REM 区切り文字が @ の場合
REM sf *@*.* @
REM ------------------------------
REM 使用例 : sf *.mp3 @
REM 削除   : sf *.mp3 @ RESET
REM ******************************
for /f "tokens=1,2* delims=%2" %%i in ( 'dir /b %1' ) do (
	if ?%%j==? (call :random_ren_first "%%i" %2) else (call :random_ren "%%i%2%%j" "%%j" %2 %3)
)

goto end

:random_ren_first
ren %1 %RANDOM%%2%1
exit /b

:random_ren
if "%4"=="RESET" (ren %1 %2) else (ren %1 %RANDOM%%3%2)
exit /b

:end

for /f の意味

in ( 文字列 ) の、文字列が ' で挟まれている場合は、その中のコマンドの結果が対象。
in ( 文字列 ) の、文字列が " で挟まれている場合は、" に挟まれた文字列が対象
in ( 文字列 ) の、文字列が 普通の文字列の場合は、該当するファイルを探してその内容を対象( ファイル名は、スペースやカンマで繋げて複数のファイルを対象にできる )

for 内で繰り返される内容

/f の後のオプションが無ければ、対象を行単位で取り込んで、スペースまたはタブで区切った先頭の文字列を取得して %%i にセットする。

ここでは、"tokens=1,2* delims=%2" というオプションがセットされているので、%%i に一番目のトークンをセットし、%%j ( 暗黙で以降の変数はアルファベット順 ) に2番目以降全ての文字列がセットされます(*がなければ、2番目のみ)。その際の区切り文字として、delims= の右辺が使用されるので、ここではバッチファイルに渡される2番目の引数を使います。( サンプルとしては、ここでは @ という文字を想定しています )

つまり、実行結果が以下のように処理されます。
abc.txt の場合、%%i が abc.txt で、%%j が 空文字
123@abc.txt の場合、%%i が 123 で、%%j が abc.txt
if ?%%j==? の意味は %%j が空文字になると、? == ? という比較になるので、一致する事になります。ですから、%%j に何か入っておれば、 else の処理で、それは元々の文字列に @ が含まれているという事で、一度シャッフル済みだという事になります。 %%j が空文字の場合は、初めての処理になるので :random_ren_first へジャンプして ランダム数値@元のファイル名というフォーマットに変更します。このフォーマットを守れば、バッチファイルの第3引数に RESET を指定すると元のファイル名に戻す事ができます。


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

2014年06月18日


コマンドプロンプト : 指定回数だけループ処理を行うバッチファイル

for コマンドを実行する毎に呼び出し先で環境変数を設定してカウントアップし、その値を errorlevel として使って判断します

▼ 4回ループ
>count.bat 4

count.bat
@echo off
setlocal

for %%i in ( *.* ) do (
	echo %%~fi
	call :count
	if errorlevel %1 ( goto end )
)

goto :end

:count
set /A COUNT=COUNT+1
exit /b %COUNT%

:end

関連する記事(解説)

環境変数をカウンタとして使う(古い方法)


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

2014年03月13日


SET /P : バッチファイルで入力した値を環境変数に設定して使用する

概要

PostgreSQL8.4.1 に付属していたバッチファイルです。

SET /P で、プロンプト入力になって、変数="文字列" の 文字列がプロンプトに表示されます
( 空入力の場合は、以前の変数の内容は変更されません )

SET /P 変数=[プロンプト文字列]
[] 部分は省略できると言う意味です。 プロンプト文字列部分に空白や特殊文字を含ませたい場合は、"" で囲います。
@echo off

REM PostgreSQL server psql runner script for Windows
REM Dave Page, EnterpriseDB

SET server=localhost
SET /P server="Server [%server%]: "

SET database=postgres
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

REM Run psql
"C:\Program Files\PostgreSQL\8.4\bin\psql.exe" -h %server% -U %username% -d %database% -p %port%

pause



server 変数の変更
C:\Users\lightbox>SET server=localhost

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [localhost]: 123

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [123]:

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [123]: localhost

C:\Users\lightbox>SET /P server="Server [%server%]: "
Server [localhost]:
posted by lightbox at 2014-03-13 20:18 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2009年11月15日


バッチファイル : コマンドプロンプトの表示幅の変更

Syntax
1) cols
2) cols 140

※ 幅を省略すると 80
@echo off
for /F "tokens=1" %%i in ('echo %1') do (
	if "%%i"=="ECHO" (
		goto default
	)
)
mode con:cols=%1
goto end 

:default
mode con:cols=80

:end 



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

2009年11月11日


バッチファイル : VS9.0のMicrosoft純正バッチ処理 : For /F : バッチファイルでレジストリの値を判断材料にする

まず、実際の実行文です( バッチファイルの一部です )
※ ファイル名 : 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日


コマンドプロンプト : バッチファイルで使う for コマンドの変数展開のテスト( vtest.bat )

%~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
)

Vtest

関連する記事
laylaClass バッチ処理支援パッケージ


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

2009年08月30日


バッチファイルで、FOR に渡すパラメータの妥当性チェックを行う

@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 | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2009年08月28日


バッチファイルで使用できる特殊な3つの環境変数



Windows の ヘルプとサポートセンターで コマンドシェル で検索すると、
コマンドシェルの概要 というのがリストの中に出てきますので、そちらに詳細があります。

1) %CD%
2) %ERRORLEVEL%
3) %RANDOM%

当然バッチファイル内でのプログラミング目的です。
環境変数は、コマンド内で置き換えられてそのまま実行されるので
以下のような使い方ができるので便利です

title ユーザーコマンドプロンプト / %cd%

これは、コマンドプロンプトのタイトルに現在のディレクトリを表示する
cur.bat(laylaClass バッチ処理支援パッケージ) の中身です。

例えばユーザ変数に現在のカレントディレクトリへ戻るコマンドをセットします
set CMD_WORK=cd %CD%

その後、cd コマンドであちこち移動しても、
%CMD_WORK% と実行すれば、元に返ってこれます


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

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

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

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

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


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

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

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

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

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


Windows
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり