SQLの窓

2024年08月05日


fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信

fake sendmail は、XAMPP に同梱されています

メールサーバは、フリーメールで可能で、簡単な設定で利用できます。以下のサンプルは、さくらインターネット で動作確認しました。

▼ 手順

ダウンロード

配布元より、sendmail.zip をダウンロードして、解凍します。
( XAMPP には sendmail フォルダがあります )

sendmail.exe の動作テスト

まず、sendmail.ini をエディタで開いて、四つのエントリを指定します
▼ さくらインターネットを使う場合の設定
smtp_server=初期ドメイン
smtp_port=587
auth_username=ユーザ@初期ドメイン
auth_password=パスワード
※ smtp_ssl=auto となっており、デフォルトで ssl で実行され、使え無い場合は TLS を使おうとします php.ini の設定
sendmail_path = "C:\tools\sendmail\sendmail.exe"
実際の sendmail.exe のパスを "" で囲んで指定します。 ※ この場合、エラーログは "C:\tools\sendmail\error.log" です( デフォルト ) PHP のコード ( UTF8 BOM なしで記述します ) HTML の input 要素で type="text" name="fld_to"、name="fld_subject"、name="fld_body"、を form 要素の中に記述し、form 要素に method="post" action="以下の PHP のファイルのパス" を指定し、form 要素の中に input 要素で type="submit" を指定したボタンを記述します。
mb_language("Japanese");
mb_internal_encoding("UTF-8");

$from_header = "From: " . mb_encode_mimeheader( mb_convert_encoding("差出人","iso-2022-jp") );

$from_header .= " <{$GLOBALS["mail"]}>";

$result = mb_send_mail($_POST["fld_to"], $_POST["fld_subject"], $_POST["fld_body"], $from_header);
if ( $result ) {
	$error = "OK";
}
else {
	$error = "ERROR";
}

print mb_language() . "
"; print $error;
$GLOBALS["mail"] は、メール形式であれば良いですが、通常ならば auth_username で指定したメールアドレスを記述します。

PHP の mb_send_mail の使用方法の全体のサンプルは、こちらを参照して下さい。





【PHP + 通信の最新記事】
posted by lightbox at 2024-08-05 10:36 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2024年08月04日


TCPDF をダウンロードして、Windows の任意のフォルダで TCPDF 同梱のサンプルを実行する為の設定

2024/08/04 時点で 6.7.5

テスト環境

❶ Windows11 64ビット + XAMPP  8.2.12 + php ( 8.2.12 )
❷ TCPDF ( C:\app\TCPDF-main として解凍 )

テスト内容
TCPDF-main.zip を解凍すると、TCPDF-main\examples というフォルダがあり、そこにサンプルが沢山ありますが、それを他のフォルダでも同様に動作させます。
手順 ❶ example フォルダを全て 任意のフォルダにコピー( アプリの実行環境になります ) ❷ そのフォルダを XAMPP で、PHP が動作するようにする ❸ tcpdf_include.php を以下のように書き換える ( set_include_path までを先頭に、require_once('tcpdf.php'); は追加、または全部以下に書き換え )
<?php
$path = "/app/TCPDF-main";
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
require_once('config/tcpdf_config_alt.php');
require_once('tcpdf.php');
?>

barcodes は、tcpdf_barcodes_1d_include.php と tcpdf_barcodes_2d_include.php の
中身の配列の参照パスの一つを realpath('/app/TCPDF-main/tcpdf_barcodes_1d.php')
のように変更すれば動作します( tcpdf_barcodes_2d_include.php も同じ )
// Include the TCPDF 1D barcode class (search the class on the following directories).
$tcpdf_barcodes_1d_include_dirs = array(
    realpath(dirname(__FILE__) . '/../../tcpdf_barcodes_1d.php'),// True source file
	realpath('/app/TCPDF-main/tcpdf_barcodes_1d.php'),// Relative from $PWD
	'/usr/share/php/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/share/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/share/php-tcpdf/tcpdf_barcodes_1d.php',
	'/var/www/tcpdf/tcpdf_barcodes_1d.php',
	'/var/www/html/tcpdf/tcpdf_barcodes_1d.php',
	'/usr/local/apache2/htdocs/tcpdf/tcpdf_barcodes_1d.php'
);

フォントの追加は、tcpdf_addfont.php で作成したフォントファイルを fonts フォルダにコピーします。




タグ:PHP PDF TCPDF
posted by lightbox at 2024-08-04 09:34 | PHP + PDF | このブログの読者になる | 更新情報をチェックする

2024年07月24日


JavaScript : window オブジェクトのプロパティとしてグローバル変数を定義する

実際は、右辺にオブジェクトをセットして専用の名前空間で参照できるライブラリのインスタンスとして利用します。

ルートで var で定義する変数と厳密には違うようですが、事実上同じと思っていいと思います。ですから、Fucntion 内でグルーバルな変数を利用したい場合は、window オブジェクトを使用すると良いでしょう
window.変数名 = "lightbox"

または

window["変数名"] = "lightbox"

例えば、ライブラリを簡単にまとめると以下のような定義のしかたになります。
(function(){

    S = {

        // いろいろな定義

        },

    // いろいろな定義
    ;

    window['MyLIB'] = S;

})();


(function(){})(); は、関数を定義して呼び出すのを一度に行う書き方で、無名関数を定義して () で実行しています
<script>

window["MyLIB"] = "lightbox";


(function(){

	alert(MyLIB);

})();

</script>



posted by lightbox at 2024-07-24 10:12 | JavaScript オブジェクト | このブログの読者になる | 更新情報をチェックする

2024年05月12日


TCPDF をダウンロードして、フリーフォントを埋め込み型で使用する方法


2024/04/20 時点で 6.7.5
2018/11/30 時点で 6.2.26
2016/01/13 時点で 6_2_12
2014/05/22 時点で 6_0_080
さくらサーバでは、php.ini で memory_limit = 256M で動作しています(日本語フォントが大きくなっていました )
2013/09/11 時点で 6_0_025TCPDF をダウンロードして、Windows の任意のフォルダで TCPDF 同梱のサンプルを実行する為の設定』の続きです。

TCPDF 用の専用フォント(情報)ファイルは TCPDF そのもの( tcpdf_addfont.php )に作成させるようになっていて、コマンドプロンプトから php で処理できます。
埋め込み : c:\php\php tcpdf_addfont.php -t TrueTypeUnicode -f 32 -i hc-poo5.ttf
非埋め込み : c:\php\php tcpdf_addfont.php -t CID0JP -f 32 -i hc-poo5.ttf

-t は省略すると フォントファイルをチェックして通常は TrueTypeUnicode になり、-f は省略すると 32 です。 ※ -b を指定すると、character bounding box の情報を php のフォントファイルに書き込みます( If true includes the character bounding box information on the php font file. )
動的にフォントファイルを作成する addTTFfont メソッドの使い方 以下のようにして使用できますが、一度作成すると無駄なコードとなる上に ttf ファイルをサーバに置く管理になるので最初に TCPDF 用のフォントファイルを作成しておいて使用するのが現実的です。( TCPDF は サーバーに ttf ファイルを必要としません )
// フォントを動的に作成して使用する方法( 作成するのは最初だけ )
// ※ 32 はデフォルトですが、メソッドの都合上省略しない
// ※ フォントフォルダのパスを / で終了させる
$fontname = TCPDF_FONTS::addTTFfont("hc-poo5.ttf", "TrueTypeUnicode", "", 32, "C:\\httpd142p\\pdf_format\\tcpdf\\fonts/");

フリーフォントは、通常システムに無いですから、『埋め込み』で処理する事になります。但しそのぶん PDF が大きくなってしまいますが、PC の環境に依存せず表示されます。
フリーフォントによっては崩れて使え無いですが、現在デフォルトで『部分埋込($font_subsetting)』により使用している文字のみ埋め込むようになっています( 全て埋め込む場合は $pdf->setFontSubsetting(false); を実行)
部分埋め込み : 84k
全て埋め込み : 4224k
🔴 フォントに依存しますが、フリーフォントを使用する場合、固定の文書ならば部分埋め込みで出力してから校正すればいいですが、動的な文書の場合は全て埋め込みにする必要があります。
	/**
	 * Boolean flag: if true enables font subsetting by default.
	 * @protected
	 * @since 5.3.002 (2010-06-07)
	 */
	protected $font_subsetting = true;

非埋め込み型は、Windows(等) に最初からあるフォントを対象とし、PDF のサイズを小さくする事が主な目的となります。

こちらから、実際に『HCP丸ゴシック(蓬莱和多流)』と言うフリーフォントを使ったPDF がご覧いただけます(部分埋め込み)。


この PDF は、サンプルの38番を書き換えたもので、オリジナルよりさらにシンプルになっています。
(部分埋め込み型です)
<?php
require_once('tcpdf_include.php');

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

$pdf->SetFont('hcpoo5', '', 20);
$pdf->AddPage();

$txt = 'example_038.pdfは非埋め込み型フォントのサンプルですが、hcpoo5はフリーフォントを埋め込み型で変換したものです

';
$pdf->Write(0, $txt, '', 0, 'L', false, 0, false, false, 0);

$pdf->SetFont('hcpoo5', '', 14);
$txt = '埋め込み	: c:\php\php tcpdf_addfont.php -i hc-poo5.ttf
非埋め込み	: c:\php\php tcpdf_addfont.php -t CID0JP -i hc-poo5.ttf

';
$pdf->Write(0, $txt, '', 0, 'L', false, 0, false, false, 0);

$pdf->SetFont('hcpoo5', '', 40);

$txt = 'こんにちは世界あいうえお漢字表示';
for( $i = 0; $i < 4; $i++ ) {
	$txt .= $txt;
}

$pdf->Write(0, $txt, '', 0, 'L', false, 0, false, false, 0);

// ---------------------------------------------------------

//Close and output PDF document
$pdf->Output('example_038.pdf', 'I');

TCPDF 用フォントの作成

作成されたフォントは、fonts フォルダにコピーされますが、再作成する場合はいったん削除します。埋め込み型では、3つ作成されますが、非埋め込み型だと1つです。
>c:\php\php tcpdf_addfont.php -t CID0JP -i hc-poo5.ttf

>>> Converting fonts for TCPDF:
*** Output dir set to C:\httpd142p\lightbox\tcpdf_6_0_080\tcpdf/fonts/
+++ OK   : C:\httpd142p\lightbox\tcpdf_6_0_080\tcpdf\tools\hc-poo5.ttf added as
hcpoo5
>>> Process successfully completed!


>c:\php\php tcpdf_addfont.php -i hc-poo5.ttf

>>> Converting fonts for TCPDF:
*** Output dir set to C:\httpd142p\lightbox\tcpdf_6_0_080\tcpdf/fonts/
+++ OK   : C:\httpd142p\lightbox\tcpdf_6_0_080\tcpdf\tools\hc-poo5.ttf added as
hcpoo5
>>> Process successfully completed!
( 上が非埋め込み、下が埋め込み )

非埋め込み型フォント使用時の代替フォントについて

TCPDF 内には cid0jp という非埋め込み型のフォントが用意されていますが、実際に PC にインストールされているフォントを内部では指定していません。なので、表示は代替フォントで表示されます。ただ、代替フォントについて詳細な情報はあまりありません。Adobe のドキュメントでのみ( 代替フォント )という言葉を見る事ができました。しかし、具体的にどのフォントを使うかまでは確認できていません。

こちらの環境(Windows)では、非埋め込み型フォントを使ってそのフォントが無い場合は代替で MSゴシックまたはMS明朝(たぶん)が使われていました
再度確認してみると、Chrome PDF Viewer で MS明朝(らしい)。Firefox 内臓ビュアーでMSゴシック
Firefox は、ブラウザの規定のフォントが使われていたので変更可能でした
Chrome は、pdf.dll の中に『Arial Unicode MS    MingLiU SimSun  MS Mincho』という文字列があったので、MS明朝が優先されているような気がします( 変更方法は不明 )

cid0jp について補足

$name='cid0jp'; 部分の cid0jp を日本語で置き換えて SHIFT_JIS で保存すると、英数字の文字ピッチは狂うと思いますが、インストールされているフォントであれば一応の表示が可能です。





漢字等にはほぼ影響出ないとは思いますが、正しいピッチで表示するにはオリジナルのフォントから非埋め込み用フォントを作成して登録する必要があります


※ Office で使用可能なフォントに関しては英語名が使用できませんでした


関連する記事

タグ:PHP TCPDF PDF
posted by lightbox at 2024-05-12 11:44 | PHP + PDF | このブログの読者になる | 更新情報をチェックする

2024年04月29日


汎用型 : JSON データより履歴書のフォームを出力するサンプル



デモページ

JSON データ

ごく一般的なデータから罫線(含連続)・BOX・テキスト・画像を出力して単票のフォームを作成します。特別な内容ではありませんが、JSON を使うと結構汎用性も出るのでは無いかと思います。

印字部分
<?php
// ************************************************
// セッションとキャッシュなし
// ************************************************
session_cache_limiter('nocache');
session_start();

require_once("print.php");

// ************************************************
// フォーマットデータ
// ************************************************
$url = "ri.json";
$file = @file_get_contents($url);
if ( $file !== false ) {
	// 連想配列形式で返す
	$result = json_decode( $file, true );

	if ( $result == null ) {
		// テキストのサイズ変更
		$pdf->SetFont('meiryo001', '', 20);
		// テキストの色
		$pdf->SetTextColor(255, 0, 0);
		user_text( $pdf, 10, 10, 'データが存在しません' );
		$pdf->Output("test_output.pdf", "I");
		exit();
	}

}


log_out(null);

$pdf->SetFont('meiryo001', '', 14);

$pdf->AddPage();

// ************************************************
// 印字コマンド実行
// ************************************************
foreach( $result['format'] as $obj ) {

	if ( $obj['type'] == 'image' ) {
		$pdf->Image($obj['f'], $obj['x'],$obj['y'],$obj['w'],$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'text' ) {
		$pdf->SetFont('meiryo001', '', $obj['s']);
		user_text( $pdf, $obj['x'],$obj['y'], $obj['t'] );
		continue;
	}

	if ( $obj['type'] == 'rect' ) {
		$pdf->Rect($obj['x'],$obj['y'],$obj['w'],$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'line' ) {
		$pdf->Line($obj['x'],$obj['y'],$obj['x']+$obj['w'],$obj['y']);
		continue;
	}

	if ( $obj['type'] == 'vline' ) {
		$pdf->Line($obj['x'],$obj['y'],$obj['x'], $obj['y']+$obj['h']);
		continue;
	}

	if ( $obj['type'] == 'lines' ) {

		$row = $obj['y'];
		
		for( $i = 0; $i < $obj['n']; $i++ ) {
			$pdf->Line($obj['x'], $row, $obj['x']+$obj['w'], $row);
			$row += $obj['p'];
		}

		continue;
	}

}


// ブラウザへ PDF を出力します
$pdf->Output("test_output.pdf", "I");
?>


TCPDF 依存部分(print.php)
<?php
define ('K_PATH_FONTS', "tcpdf/");
require_once('tcpdf/tcpdf.php');

// ************************************************
//   P or PORTRAIT(縦:既定)
//   L or LANDSCAPE(横))
// ---------------------------
//   pt: ポイント
//   mm: mm(既定)
//   cm: cm
//   in: インチ
// ---------------------------
//   用紙サイズ
// ---------------------------
// boolean $unicode = true
// ---------------------------
// String $encoding = 'UTF-8'
// ---------------------------
// boolean $diskcache = false
// ---------------------------
// PDF/A モード
// ---------------------------
// 
// 全てデフォルトなので $pdf = new TCPDF("L") でもOK
// ************************************************
$pdf = new TCPDF("P");
/*
$pdf = new TCPDF(
	"L",
	"mm",
	"A4",
	true,
	"UTF-8",
	false,
	false
);
*/

// ************************************************
// 設定
// ************************************************
$pdf->setFontSubsetting(false);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(false);


function log_out( $text ) {

	if ( $text == null ) {
		file_put_contents("log.txt","");
		return;
	}

	file_put_contents("log.txt", $text . "\n", FILE_APPEND );

}

# **********************************************************
#  テキスト印字
# **********************************************************
function user_text( $pdf, $x, $y, $text, $w=1, $h=0, $p="L" ) {

	text( $pdf, $x, $y, $text, $w, $h, $p );

	return $y;

}

# **********************************************************
# 位置指定印字
# ※ 改行コードで自動改行
# ※ ページあふれで自動改ページ
# ※ 内部印字位置は保存( 元に戻す )
# **********************************************************
function text( $pdf, $x=0, &$y=0, $txt='', $w=1, $h=0, $p="L" ) {

	$a = $pdf->GetX();
	$b = $pdf->GetY();

	$hm = $pdf->getPageHeight( );
	$dm = $pdf->getPageDimensions();
	$tm = $dm['tm'];
	$bm = $dm['bm'];

	$txt = str_replace( "\r","", $txt );
	$data = explode("\n", $txt );
	if ( count( $data ) > 1 ) {
		for( $i = 0; $i < count($data); $i++ ) {
			if ( $i == 0 ) {
				$pdf->SetXY( $x, $y );
			}
			else {
				$y += $pdf->getLastH();
				if ( $y >= ( $hm - $tm - $bm ) ) {
					$pdf->AddPage();
					$y = $tm;
				}
				$pdf->SetXY( $x, $y );
			}
			$pdf->Cell($w, $h, $data[$i], 0, 0, $p);
		}
	}
	else {
		$pdf->SetXY( $x, $y );
		$pdf->Cell($w, $h, $txt, 0, 0, $p);
	}
	$y += $pdf->getLastH();

	$pdf->SetXY($a,$b);

}


?>


関連する記事

1会話・IFRAME(TCPDF)テンプレート : jQuery + Bootstrap(css) + mmenu + Firebase + TCPDF + PHP




タグ:PDF PHP TCPDF Firebase
posted by lightbox at 2024-04-29 02:26 | PHP + PDF | このブログの読者になる | 更新情報をチェックする

2024年02月15日


ChatGPT で トップまでスクロールする ブックマークレット

ブックマークバーにドラッグ & ドロップしてください。

共有用のリンクページでも動作するようです

CharGPT scroll TOP

<a href="javascript:document.getElementsByClassName('text-base')[0].scrollIntoView(false);void(0);">CharGPT scroll TOP</a>


posted by lightbox at 2024-02-15 15:07 | ChatGPT | このブログの読者になる | 更新情報をチェックする

2023年08月04日

2023年08月03日


Replit : js-csv-read-utf8

https://replit.com/@sworc/js-csv-read-utf8



CSV エディタは拡張で追加して、.csv ファイルを右クリックして選択。
そののちタブをリロードしないと表示されない謎拡張



posted by lightbox at 2023-08-03 16:36 | Replit | このブログの読者になる | 更新情報をチェックする

2023年08月02日

2023年03月02日


指定した位置でレジストリエディタを開く為の VBScript をダウンロードします

理屈としては、regedit は、終了する時に表示していたパスをレジストリに保存しており、その場所に書き込む事によって regedit を起動した時に好きな場所が表示されるようにしています。
保存場所 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey
コンボボックスにいくつかサンプルを用意しています。入力フィールドに直接セットしてもいいですし、いったんダウンロードしたソースの先頭のパスを変更しても OK です。
IE11 ソースエディタは、インターネットオプションのプログラムでメモ帳を選択してからアクセスします

一度ダウンロードしたソースコードの先頭の strParam にレジストリのパスを設定するだけで使えます
strParam = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピューター\" & strParam
else
	strRegPath = "マイ コンピュータ\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function





posted by lightbox at 2023-03-02 08:43 | VBScript | このブログの読者になる | 更新情報をチェックする

2023年02月14日


JScript / VBScript : 指定したフォルダ内のフォルダ毎の使用済みサイズを読める範囲でレポートする

フォルダを整理するのはとてもたいへんな作業なので、まずは容量で優先順位を決めましょう

▼ JScript のダウンロード

▼ VBScript のダウンロード

✅ スクリプト実行 ✅ 結果 System Volume Information は、無駄に使われてる場合が多いそうです。 ✅ 参考ページ ✅ System Volume Information をエクスプローラで表示させる ✅ データを削除

show-folders-size.js

// ************************************************
// カンマ編集
// ************************************************
String.prototype.number_format = 
function (prefix) {
	var num = this.valueOf();
	prefix = prefix || '';
	num += '';
	var splitStr = num.split('.');
	var splitLeft = splitStr[0];
	var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
	var regx = /(\d+)(\d{3})/;
	while (regx.test(splitLeft)) {
		splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
	}
	return prefix + splitLeft + splitRight;
}

// ************************************************
// オブジェクト
// ************************************************
var Shell = new ActiveXObject("Shell.Application");
var WshShell = new ActiveXObject("WScript.Shell");
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );

// ************************************************
// 管理者権限のコマンドプロンプトで再実行
// ************************************************
if ( WScript.Arguments.length == 0 ) {
	Shell.ShellExecute( "cmd.exe", "/c cscript.exe " + Dd(WScript.ScriptFullName) + " next" + " & pause", "", "runas", 1 );
	WScript.Quit();
}


var target = SelectDir( "対象フォルダを選択して下さい" )
if ( target == "" ) {
	WScript.Quit();
}

WScript.Echo( target )

// ************************************************
// フォルダオブジェクト取得
// ************************************************
var objFolder =  Fso.GetFolder(target)

var folderCollection = new Enumerator(objFolder.SubFolders);

var TargetSize = 0;
var obj;
var num;
var line;
for ( ;!folderCollection.atEnd(); folderCollection.moveNext()) {

	obj = folderCollection.item();
	
	try {
		num = Math.floor(obj.Size / 1024) / 1024;
		num = Math.floor( num * 1000 ) / 1000
		line = Lpad(("" + num).number_format()," ", 15) + " M : " + obj.Name
		WScript.Echo( line );

		// フォルダ全体の合計
		TargetSize = TargetSize + obj.Size
	}
	catch(e) {
		WScript.Echo( obj.Name + " : 処理できません");
	}

}

WScript.Echo( "" );

num = Math.floor(TargetSize / 1024) / 1024;
num = Math.floor( num * 1000 ) / 1000
line = Lpad(("" + num).number_format()," ", 15) + " M : " + "表示合計"
WScript.Echo( line );

// ************************************************
// ディレクトリ選択
// ************************************************
function SelectDir( strTitle ) {

	var obj

	obj = Shell.BrowseForFolder( 0, strTitle, 0x4B, 0 )
	if ( obj == null ) {
		return "";
	}
	if ( !obj.Self.IsFileSystem ) {
		ErrorMessage = "ファイルシステムではありません";
		return "";
	}

	return obj.Self.Path;

}

// ************************************************
// ダブルクォートで囲む
// ************************************************
function Dd( strValue ) {

	return "\"" + strValue + "\""

}

// ************************************************
// 指定数、指定文字列左側を埋める
// ※少数以下3桁の調整
// ************************************************
function Lpad( strValue, str, nLen ) {

	var i;
	var wk = "";

	for( i = 0; i < nLen; i++ ) {
		wk += str;
	}
	
	var test = strValue.split(".");
	if ( test.length == 2 ) {
		if ( test[1].length == 0 ) {
			strValue += "000"
		}
		if ( test[1].length == 1 ) {
			strValue += "00"
		}
		if ( test[1].length == 2 ) {
			strValue += "0"
		}
	}
	else {
		strValue += ".000"
	}

	return ( wk + strValue ).slice( nLen * -1 );

}


show-folders-size.vbs

' ************************************************
' 管理者権限で実行用
' ************************************************
Set Shell = CreateObject( "Shell.Application" )

' ************************************************
' 管理者権限で再実行
' ************************************************
if Wscript.Arguments.Count = 0 then
	Shell.ShellExecute "cmd.exe", "/c cscript.exe " & Dd(WScript.ScriptFullName) & " next" & " & pause", "", "runas", 1
	Wscript.Quit
end if

' ************************************************
' 除外フォルダ名を スペースで区切って並べる
' (簡易的な除外)
' ************************************************
Dim Exclude
Exclude = ".gem"
Exclude = Lcase(Exclude)

' ************************************************
' 処理用
' ************************************************
Set WshShell = CreateObject( "WScript.Shell" )
Set Fso = CreateObject( "Scripting.FileSystemObject" )

Dim target

' ************************************************
' 対象フォルダを選択
' ************************************************
target = SelectDir( "対象フォルダを選択して下さい" )
if target = "" then
	Wscript.Quit
end if

Wscript.Echo target
Wscript.Echo

' ************************************************
' フォルダオブジェクト取得
' ************************************************
Set objFolder =  Fso.GetFolder(target)

' ************************************************
' サブフォルダコレクション取得
' ************************************************
Set colSubFolder =  objFolder.SubFolders

' ************************************************
' 一覧
' ************************************************
Dim TargetSize : TargetSize = 0
For Each obj in colSubFolder

	Do While true

		if InStr(Exclude,Lcase(obj.Name)) > 0 then
			Exit Do
		end if

		on error resume next
		Wscript.Echo Lpad(FormatNumber((Fix(obj.Size / 1024) / 1024),3)," ", 15) & " M : " & obj.Name
		if Err.Number <> 0 then
			Wscript.Echo "                  ( " & obj.Name & " : 処理できません )"
		else
			TargetSize = TargetSize + obj.Size
		end if
		on error goto 0


		Exit Do
	Loop


Next

Wscript.Echo

Dim AllSize
Dim er : er = 0
on error resume next
AllSize = objFolder.Size
if Err.Number <> 0 then
	er = 1
	AllSize	= TargetSize
end if
on error goto 0


Wscript.Echo Lpad(FormatNumber((Fix(TargetSize / 1024) / 1024),3)," ", 15) & " M : " & "表示合計"

if er = 1 then
	Wscript.Echo "                  ( " & target & " のサイズは取得できませんでした )"
else
	Wscript.Echo Lpad(FormatNumber((Fix(AllSize / 1024) / 1024),3)," ", 15) & " M : " & target & " のサイズ"
end if

Dim fsize : fsize = 0
For Each file in objFolder.files
	fsize = fsize + file.size
Next
Wscript.Echo Lpad(FormatNumber((Fix((fsize) / 1024) / 1024),3)," ", 15) & " M : " & target & " 下のファイル"

Wscript.Echo

' ************************************************
' ディレクトリ選択
' ************************************************
Function SelectDir( strTitle )

	Dim obj

	Set obj = Shell.BrowseForFolder( 0, strTitle, &H4B, 0 )
	if obj is nothing then
		SelectDir = ""
		Exit Function
	end if
	if not obj.Self.IsFileSystem then
		ErrorMessage = "ファイルシステムではありません"
		SelectDir = ""
		Exit Function
	end if

	SelectDir = obj.Self.Path

End Function

' ************************************************
' ダブルクォートで囲む
' ************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function

' ************************************************
' 指定数、指定文字列左側を埋める
' ************************************************
Function Lpad( strValue, str, nLen )

	Lpad = Right( String(nLen,str) & strValue, nLen )

End Function






posted by lightbox at 2023-02-14 13:56 | WSH JScript | このブログの読者になる | 更新情報をチェックする
container 終わり



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

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