SQLの窓 イラストAC フリー素材

2013年12月30日

バッチファイルテクニック : 他のコマンドの標準出力の結果で処理を分岐する

バッチファイルには古くからお世話になっていますが、その長い歴史で最も特殊な機能です。もちろん、本家( Unix )にはそれこそ昔からあるのですけれど。

まず、標準出力になにがしかを出力するコマンドを作る必要があります。VB.NET で作成して、vbc.exe でビルドして使えはいいのですが、もっと簡単に VBScript を使います。ここでは、ini.vbs というスクリプトを元に話をすすめていきます。

ini.vbs はini ファイルの中の値を取り出す簡単なスクリプトです。例えば php.ini の中に
[PHP]
error_reporting  =  E_ALL & ~E_NOTICE & ~E_STRICT
と書かれているとすると、cscript.exe //NOLOGO ini.vbs "php.ini" php error_reporting で、E_ALL & ~E_NOTICE & ~E_STRICT を標準出力に出力します。 ですが、このままではコマンドとして使うには cscript.exe を毎回書く必要があるので、同じディレクトリにini.bat を作成して、以下のように書きます。
@echo off
cscript.exe //NOLOGO "%~dp0ini.vbs" "%1" %2 %3
そして、この二つのファイルをパスの通ったディレクトリに置くと、"ini" というコマンドの出来上がりです。 で、このコマンドを使ったバッチファイルが以下のようになります
@echo off
SETLOCAL
SET ini_var=
For /F "delims=" %%i in ('ini.bat "c:\php\php.ini" php error_reporting') do (
	if "%%i"=="E_ALL & ~E_NOTICE & ~E_STRICT" (call :type1) else (call :type2)
)

if "%ini_var%"=="" (call :type3)
goto :end

:type1
echo ******************
echo エントリ一致
echo ******************
SET ini_var=type1
exit /b

:type2
echo ******************
echo エントリ不一致
echo ******************
SET ini_var=type2
exit /b

:type3
echo ******************
echo エントリなし
echo ******************
exit /b

:end
ENDLOCAL

SETLOCAL は、ENDLOCAL までの間に使った環境変数をクリアして元に戻すという、バッチファイルのためにある都合のいいコマンドです。

こうしておくと、いろいろ都合のいい処理を if "%環境変数%"=="内容"として実行が可能になりますし、内容を直接実行はそもそもの機能です。

(例)
SET MYVAR=DIR
%MYVAR%

しかし、この処理のメインは 'ini.bat "c:\php\php.ini" php error_reporting' で、このコマンドが標準出力に表示した結果が %%i にセットされます。これを使って、内部サブルーチンを呼び出しています。

"delims=" は、デフォルトだと空白が区切り文字になってしまって、値に空白が含まれると変数に正しく入らないので、区切文字をなしにする書き方です。

その結果、戻された値と E_ALL & ~E_NOTICE & ~E_STRICT が等しい場合は type1 の処理を実行し、一致しなければ type2 の処理を実行します。エントリが無い場合や、エントリの値が空白の場合は、type3 の処理を実行します。

ちなみに、Microsoft の Visual Studio の中にバッチビルド用のバッチファイルがあるのですが、その中でこんな感じの処理をしています。あっちでは、reg.exe でレジストリの中の内容によって処理変えてましたが、整理するとこういう事だったわけです。

※ For は複数のループなので、標準出力の結果が複数行の場合は、複数回処理されます



posted by at 2013-12-30 05:44 | コマンドプロンプト | このブログの読者になる | 更新情報をチェックする

2013年12月28日

指定サービスを一括で停止するスクリプト



*************************************************************
* 【list.vbs】
* 現在実行中のサービスの一覧より、停止対象を決定する為の
* テキストファイル( target.txt ) を作成する
*
* 【stop.vbs】
* target.txt で指定したサービスを停止する
*************************************************************

1) list.vbs をエクスプローラから実行して下さい

2) target.txt の中から停止したいサービス名の先頭のセミコロン
   を削除して下さい

3) stop.vbs をエクスプローラから実行して下さい



※ 再度 list.vbs を実行すると、target.txt に無いサービスを
   発見した場合は、リストの最後に追加します

※ サービスの依存関係は、上に依存元のサービスを持ってきて下さい。

※ 最初の作成では、全ての実行中のサービスリストが作成されますが、
   先頭にセミコロンが入ったままでは、stop.vbs を実行しても何も
   停止されません。


■著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。

lightbox
stop_service_started.vbs
' 管理者として実行を強制する
Set obj = Wscript.CreateObject("Shell.Application")
if Wscript.Arguments.Count = 0 then
	obj.ShellExecute "cscript.exe", WScript.ScriptFullName & " runas", "", "runas", 1
	Wscript.Quit
end if

str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "エクスプローラから実行する場合は、stop.vbs を使用して下さい"
	WScript.Echo strMessage
	WScript.Quit
end if

Set Fso = Wscript.CreateObject( "Scripting.FileSystemObject" )

strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurDir = obj.Path

strServer = "."

on error resume next
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

Set objWmi = objLocator.ConnectServer( _
	strServer, _
	"root\cimv2", _
	strUser, _
	strPass )
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if

objWmi.Security_.ImpersonationLevel = 3
if Err.Number <> 0 then
	Wscript.Echo Err.Description
	Wscript.Quit
end if
on error goto 0

Set InObj = Fso.OpenTextFile( strCurDir & "\target.txt", 1 )
aTarget = Split( InObj.ReadAll(), vbCrLf )
InObj.Close()

For I = 0 to UBound( aTarget ) 

	if Trim( aTarget( I ) ) <> "" and Left( aTarget( I ), 1 ) <> ";" then

		strQuery = "select * from Win32_Service where Name = '" & aTarget(I) &  "'"
		Set objTarget = objWmi.ExecQuery( strQuery )

		on error resume next
		For Each obj in objTarget

			if obj.Started then
				obj.StopService()
				Wscript.Echo obj.Name & " を停止させました"
			end if

		Next
		on error goto 0

		' 終了待ち
		nCnt = 0
		Do while true
			Wscript.Sleep 1000

			Set objTarget = objWmi.ExecQuery( strQuery )
			For Each obj in objTarget 
				strResult = obj.State
			Next 

			if strResult = "Stopped" then
				Exit Do
			end if

			nCnt = nCnt + 1
			if nCnt > 60 then
				Exit Do
			end if

		Loop

	end if

Next



posted by at 2013-12-28 12:45 | VBScript | このブログの読者になる | 更新情報をチェックする

BatchHelperオブジェクト

マニュアルページ

いわゆる、COM です。スクリプトベースのプログラミングにはまだまだ必要なはずなんですが。運用で WSH でバッチ処理って工夫次第でいろんな事できると思うんですけど。

オンラインでインストールする為のスクリプト


インストーラのダウンロード

インストール

setup.wsf を実行して下さい。

テスト

【 OpenFileName 】
Path = BatchHelper.OpenFileName( [Title], [Filter], [DefaultDir], [DefaultExt], [DefaultName] )

コモンダイアログでファイルのパスを取得します 

Title (省略可): ダイアログのタイトル
Filter (省略可): フィルターリスト ( 例: "CSV,*.csv,全て,*.*" )
DefaultDir (省略可): 初期ディレクトリ
DefaultExt (省略可): デフォルトの拡張子
DefaultName (省略可): デフォルトのファイル名 

キャンセル時、Path は "" (空文字列) になります
▼ ファイルを開く(パスを取得する)為のダイアログをスクリプト
Set BatchHelper = Wscript.CreateObject( "Lbox.BatchHelper" )
Path = BatchHelper.OpenFileName( _
	"ファイルを開く", _
	"テキスト,*.txt,ログ,*.log,全て,*.*", _
	"C:\Users\lightbox\Downloads" )

if Path <> "" then
	BatchHelper.MsgOk( "ファイルが選択されました : " & vbCrLf & Path )
end if

2006年11月04日 : 初回投稿


posted by at 2013-12-28 12:17 | VBScript | このブログの読者になる | 更新情報をチェックする

2013年12月23日

WEBで縦書きのコンテンツを作成する( jQuery プラグイン )

tate.js のダウンロード
※ 日本語が utf-8 で書かれています。
※ IE は 10以上でないと文字が回らないです(方法はありますが、実装しても意味なさそうなので )
関連する記事

jQuery プラグイン : 日本語を縦書きにする( 縦書きスクリプト )



posted by at 2013-12-23 03:27 | jQuery | このブログの読者になる | 更新情報をチェックする

2013年12月20日

PHPでサービス停止( extension=php_com_dotnet.dll )

PHP 5.3.15 / 5.4.5 以降は、php_com_dotnet.dll を php.ini で有効にしておく必要があります。また、WWW サーバが OS にアクセスするユーザの権限が Administrator である必要があり、デスクトップから実行する WWW サーバーでも、『管理者として実行』する必要のある環境もあります(通常はこの方法が必要です)。

以下の php を FORM から method="POST" で呼び出して、サービス名を引き渡すようにすればいいと思います
<?php

$str = "winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2";

$obj = new COM($str);

$ret = $obj->ExecQuery( "Select * from Win32_OperatingSystem" );

print "<PRE>";

foreach( $ret as $key => $target ) {
	print "{$target->Caption}\n";
	print "{$target->CSName}\n";
	print "$target->ServicePackMajorVersion";
	print ".{$target->ServicePackMinorVersion}\n";
	print "{$target->WindowsDirectory}\n";
	print "{$target->SystemDirectory}\n";
}

print "\n";
# **********************************************************
# Spooler ( 停止 )
# **********************************************************
$Query = "select * from Win32_Service where Name = 'Spooler'";
$RunningServices = $obj->ExecQuery($Query);
foreach( $RunningServices as $target ) {
	$ReturnCode = $target->StopService();
	print $ReturnCode;
}

# 終了待ち
$Cnt = 0;
while ( 1 ) {
	sleep( 1 );

	$RunningServices = $obj->ExecQuery($Query);
	foreach( $RunningServices as $target ) {
		$Result = $target->State;
	}

	if ( $Result == "Stopped" ) {
		print " -> Spooler Stopped";
		break;
	}

	$Cnt++;
	if ( $Cnt > 60 ) {
		print " -> Timeout";
		break;
	}

}

print "</PRE>";
print "OK";

?>

▼ 実行結果
Microsoft Windows 7 Professional 
PC名
1.0
C:\Windows
C:\Windows\system32

0 -> Spooler Stopped
OK
※ $ReturnCode が 0以外の場合はエラーです。
posted by at 2013-12-20 17:57 | PHP | このブログの読者になる | 更新情報をチェックする

2013年12月18日

PHP : コマンドライン php(cli) で10進数と16進数の変換

たいていは calc.exe で行うと思いますが、PHP があるのならコマンドラインで作業している時は使ってみてもいいかもしれません。ただ、パスが通っていないと面倒なので、これで登録しておいてもいいですね。
rundll32.exe sysdm.cpl,EditEnvironmentVariables
コマンドプロンプトを開いたら、prompt $g で、プロンプトを短くしておいたほうがいい場合もあります。 さて。 16進数が 8559 の時
php -r print(0x8559);
注意するのは、最後のセミコロンを忘れない事と、スペースが必要な場合は、コマンド全体をダブルクォートで囲む事です。
php -r "print 0x8559;"
10進数が 34137 の時
php -r print(dechex(34137));
posted by at 2013-12-18 16:12 | PHP | このブログの読者になる | 更新情報をチェックする

2013年12月14日

仕様書の書き方?? スケジュール管理??

Google+ のコミュニティですが、答えるとなると長文が書ける・・・。

質問をする為の掲示板は昔からありましたが、Google+ はちょっと作業しづらい感があります。そのせいか、他の内容がだいたいにおいて漠然としていて、とても本腰入れて返答したようには見えないし、質問側も返答に対するレスポンスがぱっとしない・・・。プログラマ専用にもっと広いフィールドが欲しいですよね。

開発経験の無い人は、『スケジュール』という文言の意味するところが実感できていません。単なる『予定』と思っている人が多いです。開発は、納期が必ず決まっているのでそこからの逆算で、人員を用意しています。個々のスケジュール管理は全体から見た微調整で、遅れれば、なにらかのテコ入れが必要ですし、進めば
前倒しが必然となります。

また、そうした前提でスケジュールを立てるにしても、持ち時間を全てプログラミングに使えるわけでは無く、移動や休憩や会議もあります。それらをふまえて週間単位で予定を考えるところから『スキル』が必要である事になります。全く持って単純では無いわけなんですが・・・・

学生なんかのやってるのは、全く殆ど『ままごと』です。

1) プログラム一覧

  スケジュール管理に必要になります
  スケジュール管理するには、時間見積りが必要です
  時間見積りするには、見積りする単位が必要です
  一般的にはエンドユーザのタスク単位になります

2) 入力設計書

   画面設計書と入力項目単位のチェックや属性
  できればエラーメッセージの定義も欲しいです

3) 出力設計書

   広い意味では、画面に対する編集処理も含まれますが
  一般的には、テーブルに対する更新方法の定義です
  さらに、印刷帳票のフォーマット設計も含まれます

4) テーブル設計

  これは基本設計として、システムに必要な項目を
  プロが並べ替えたものですが、エンドユーザへの
  確認資料にもなります。

5) 概要書

  これ一枚でプログラム単位の一つの全体像が全て
  認識できるものです。このフォーマットが会社単位で
  違いますが、1) 〜 4) は目的に沿っておれば内容は皆同じです

6) オブジェクト定義

  今時の開発ではこれらも必要となるのでしょうが、これこそ
  会社によって全く違うものになると思います。
  正直ここは良く解りませんが、昔は機能定義とか関数定義
  等で、ブログラマ寄りの設計書であったため、作られる事
  がまれではありました。

7) スケジュール

  本来は、開発メンバの為に存在するのでは無く、会社が
  クライアントの納期を守る為にあります。ですから、
  プログラム単位のスゲジュールと、担当者単位の
  スケジュールで管理者が管理します。

8) ガントチャート

  スケジュールはこの方式で語られる事が多いようですが、
  予定と実績が管理できるものが、週間・月間で検証できる
  ものであれば良いです。

  とは言うものの、見積りが無い以上スケジュールは
  無意味ではあります。また、一日に使える時間を把握
  していないと、また無意味です。

  最初は、その見積りができるようになる為に、仮のスケ
  ジュールで開発し、それに使われた時間を記録しておいて
  プログラム単位でのボリュームを理解する必要があります


posted by at 2013-12-14 20:41 | システム開発 | このブログの読者になる | 更新情報をチェックする

2013年12月08日

DAZ3D : 初音ミクと刀



やはり日本人。刀を持たせる事になにか憧れを感じます。ですが、いままで持ち方を工夫した事が無かったので、ちょっと努力してみました。刀はどちらかの掌に固定しなければならないので、結構両手での表現は面倒です。なんで、持ち替える瞬間のシーンです。







posted by at 2013-12-08 01:48 | DAZ3D DAZStudio イラスト 2013 | このブログの読者になる | 更新情報をチェックする

2013年12月06日

フリーフォントで簡単ロゴ作成の Flash 部分を、Flash がインストールされていない場合『入力』できるようにしました

▼ 以下へ移動しました
http://wahaha.winofsql.jp/article/387740408.html



posted by at 2013-12-06 22:43 | フリーフォントで... | このブログの読者になる | 更新情報をチェックする

PHP 5.2.0 以上で、サーバー間で FTPS( SSL 接続 )でファイル転送を行う

PHP でセキュアな FTP 操作は、標準では cURL を使うしかありませんが、PHP 5.2.0 である必要があります。

定義済み定数
<?php
header( "Content-Type: text/plain" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

$curl_const = array();

$curl_const[] = CURLOPT_FTP_SSL;
$curl_const[] = CURLFTPSSL_NONE;
$curl_const[] = CURLFTPSSL_TRY;
$curl_const[] = CURLFTPSSL_CONTROL;
$curl_const[] = CURLFTPSSL_ALL;

print_r($curl_const);

?>

上記コードでは以下のような結果で表示されます
Array
(
    [0] => 119
    [1] => 0
    [2] => 1
    [3] => 2
    [4] => 3
)
<?php
header( "Content-Type: text/plain" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// *********************************************************
// ユーザとパスワード
// *********************************************************
$username = 'ユーザ';
$password = 'パスワード';

// *********************************************************
// 対象ファイル
// ログインディレクトリからの相対位置
// ( SSL のサーバーチェックの為、独自ドメインは使えません )
// *********************************************************
$url = 'lightbox.sakura.ne.jp/www/homepage/download/WinOfSql102.zip';

// *********************************************************
// URL
// *********************************************************
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;

// *********************************************************
// 開始
// *********************************************************
$ch = curl_init();

// *********************************************************
// デバッグ用の詳しいメッセージを出力
// *********************************************************
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
$fpe = fopen("./debug.txt","w");
curl_setopt($ch, CURLOPT_STDERR, $fpe);

// *********************************************************
// サーバーのパス
// *********************************************************
curl_setopt($ch, CURLOPT_URL, $ftp_server);

// *********************************************************
// SSL である事の明示
// *********************************************************
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL); // SSL for all communication or fail 

// *********************************************************
// SSL に必要なオプション
// *********************************************************
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);	// 2はデフォルト値( 1は7.28.1 以降では使えなくなりました )

// *********************************************************
// ダウンロードされるファイルの保存設定
// *********************************************************
$fp = fopen("./WinOfSql102.zip","w");
curl_setopt($ch, CURLOPT_FILE, $fp);

// *********************************************************
// 実行
// *********************************************************
$result = curl_exec($ch);

// *********************************************************
// 終了
// *********************************************************
curl_close($ch);

// *********************************************************
// 後処理
// *********************************************************
fclose($fp);
fclose($fpe);

if ($data === false) {
	print "cURL failed\n";
}
else {
	print "OK\n";
}

?>

関連する情報

Curl: ftp.c ignores some SSL errors regardless of the curl_ftpssl setting




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

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

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

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

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


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

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

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

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

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