スポンサーリンク

バッチで,複数ファイルを一括で「連番リネーム」するサンプルコード (写真や画像ファイルをフォルダ内で自動ナンバリングし,簡単に整理)

Windowsバッチで,複数ファイルを一括でリネームするサンプルコード。


フォルダ内の全ファイルについて,
連番をつけながら自由に名称変更できる。

デジカメの画像・写真などの整理に便利。


マッチ対象のファイルパターンや,リネーム方法などは
正規表現で自由に組み替えられる。

ナンバリングは必須ではなく,番号なしでリネームすることもできる。


対象のフォルダ内に下記のバッチファイルを置いて,ダブルクリックするだけ。


_リネーム.bat

@if(0)==(0) ECHO OFF

rem このバッチのあるフォルダをカレントとしてWSHを実行
cscript.exe //nologo //E:JScript "%~f0" %0\..

@pause
GOTO :EOF
@end


// 共通関数

// デバッグ出力
function log(s){WScript.Echo(s);}

// 正数を指定桁に0埋め
Number.prototype.zero_padding = function( digit_num ){
	// 整数化
	var num = parseInt( this, 10 );
	
	// 0埋めの必要がない場合
	if( ( "" + num ).length >= digit_num ){
		return ( "" + num );
	}
	
	// 指定した条件まで0埋め
	var continue_flag = true;
	var zeros = "0";
	while( continue_flag ){
		if( ( zeros + num ).length >= digit_num ){
			continue_flag = false;
		}else{
			// 0を付け足す
			zeros += "0";
		}
	}
	return zeros + num;
};



// メイン処理

log("カレントフォルダ内でリネームします。");


// このバッチのあるフォルダ
var current_dir_path = WScript.Arguments(0);


// カレントフォルダを変更
WScript.CreateObject("WScript.Shell").CurrentDirectory = current_dir_path;
	//log( "現在のカレントディレクトリ:" 
	//	+ WScript.CreateObject("WScript.Shell").CurrentDirectory );


// このフォルダ内のファイルを全取得
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var folder = fso.GetFolder( current_dir_path );
var enumerator = new Enumerator( folder.Files );


// 配列に移し変えて名前順にソート
var arr = [];
for ( ; ! enumerator.atEnd(); enumerator.moveNext() ){
	arr.push( enumerator.item() );
}
arr.sort(function(item1, item2){
	return ( item1.Name > item2.Name );
});


// 一つずつ処理
var cnt = 1;
for ( var i = 0; i < arr.length; i ++ ){
	
	// このファイルの名前
	var item = arr[i];
	var file_name = item.Name;
	
	// マッチするものに絞り込む
	//
	// ★マッチ条件は適宜書き換える
	//
	var m;
	if( m = file_name.match(/^.+\.png$/) ){
		log( "リネーム対象:" + file_name );
		
		// キャプチャ括弧の参照
		//log( m[1] + ", " + m[2] );
		
		// 新ファイル名
		//
		// ★リネーム方法は適宜書き換える
		//
		var new_file_name = "photo_"
			+ cnt.zero_padding(3)
			+ ".png"
		;
			//log( new_file_name );
		
		// リネーム実行
		item.Name = new_file_name;
		log( "リネームしました。" + new_file_name );
		
		// 連番をインクリメント
		cnt ++;
	}
}
log("全リネーム完了");

★マークの付いた2箇所を書き換えれば,自由に処理を変更できる。

続きを読む

Webページの「コピペ禁止」を解除・回避するJavaScriptコード。スクリプト有効のまま,ブラウザ上で右クリック・テキスト選択の禁止タグを迂回する

Webページ上で,「コピペ禁止」を解除するJavaScriptコード。


ブラウザ上で,マウスで文章を選択して,右クリック→コピー
という操作は,HTML側で禁止できる。

Webサイトの内容が, コピペで無断転載されるのを防ぐためだ。


しかし,その禁止をかいくぐる方法もある。

たとえばブラウザの設定で「JavaScriptを無効にする」というのが一番簡単な方法。


もしJavaScriptを有効のまま,コピペ禁止だけを解除したい場合,

下記のJavaScriptコードを実行すればよい。

(Firefoxなら,Firebugのコンソール上で実行できる。)

// HTML5ではないページもあるし,
// Arrayのイテレータがない場合もあるので
// 古典的な記法を使う。

// 入れ替えるイベントリスナ
var f = function(){ return true; };

// 書き換え対象のDOMイベント名
var evs = "beforecopy beforecut click contextmenu copy dragstart mousedown mouseup selectstart".split(" ");

// 書き換え対象のCSS属性名
var props = "userSelect MozUserSelect MsUserSelect WebkitUserSelect".split(" ");

// 1要素に対する書き換え操作
function replace_events( elem ){
  // イベント
  for( var i = 0; i < evs.length; i ++ ){
    elem[ "on" + evs[i] ] = f();
  }
  // CSS属性
  if(elem.style){
    for( var i = 0; i < props.length; i ++ ){
       elem.style[  props[i] ] = "";
    }
  }
}

// 全要素に対し
var elems = document.getElementsByTagName("*");
for(var i = 0; i < elems.length; i ++){
  replace_events( elems[i] );
}
replace_events( document );

これで,どんなページでも大概はコピペ可能。

サイト側が WordPress のプラグインでコピペ禁止処理を実装している場合なんかは,これで突破できる。


注意:悪用を禁ずる。


解除コードの解説

Webページ上でコピペを禁止する方法は2つあって,
(1)JavaScriptを使う手と
(2)CSSを使う手 
がある。


これらの「コピペ防止」テクニックは,下記の記事にまとめられている。

HTML・CSS3・JSを使い,Webサイトを「コピペ禁止」にする方法のまとめ。右クリックや文字列選択・内容の複製をできなくする無効化テクニック集
http://computer-technology.hateblo.jp/entry/20150717/p1

  • Webページを「コピペ不可能」にするためのテクニックまとめ。
  • マウスで右クリックしてコピー,Ctrl + C で無断転載,などの行為を禁止できる。 CSSやJavaScriptでの手法を網羅した。
続きを読む

jQueryを使ったサクサクWebスクレイピングのサンプルコード (WSH/JScriptバッチでIEを自動操作する時の $ セレクタが柔軟すぎる!)


バッチでIEを自動操作する際に,jQuery を使ってスクレイピングする。

$() によるセレクタ機能をはじめ,
jQueryのDOM操作をフルに WSH バッチ上で活用できる。


下記のバッチをただ単にダブルクリックするだけで,全処理を実行できる。

jQueryをダウンロードする必要はない。


hoge.js

// ------------------ jQueryでスクレイピング ------------------



// 現在のページ内でjQueryを有効化する(スクレイピングしやすいように)
function ie_inject_jquery( ie ){

	// 既に$があるか
	//if( ie.document.$ ) return;

	// script要素を新規作成
	var elem_head = ie.document.getElementsByTagName('head')[0];
	var elem_script = ie.document.createElement('script');
	elem_script.src =  "https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js";
		// https://developers.google.com/speed/libraries/devguide#jquery
	
	// ロード完了時のイベントを定義
	var load_complete = false;
	elem_script.onload = function(){
		load_complete = true;
	};
	
	// HEADにscriptタグを追加
	elem_head.appendChild( elem_script );
	
	// scriptのロード完了まで待つ
	while( load_complete ){
		WScript.Sleep( 500 );
	}
	
	// $を評価可能になるまで待つ
	while( ! ie.document.parentWindow.$ ){
		WScript.Sleep( 500 );
	}

	// WSHのグローバルで参照を定義
	$ = ie.document.parentWindow.$;
	//log("IEにjQuery注入完了");
	
	return;
}

/*
// IE上でjQueryを使う
function $( s ){
	return ie.document.parentWindow.$( s, ie.document );
}

↑ $.trim など様々な関数に対応したいので,
この関数は不要。

*/


// 遷移先の全ページ内でjQueryを有効化する
always_enable_JQuery = false;
function ie_enableJQuery(){
	always_enable_JQuery = true;
}



// ------------------ IEの基本操作 ------------------



// IE起動
function getIE()
{
	var ie = WScript.CreateObject("InternetExplorer.Application")
	ie.Visible = true;
	ie_goto_url( ie, "http://www.google.co.jp/" );
		//log("ブラウザでのアクセスを開始します。");
	
	return ie;
}


// IEがビジー状態の間待ちます
function ie_wait_while_busy( ie, _url )
{   
	var timeout_ms      = 45 * 1000;
	var step_ms         = 100;
	var total_waited_ms = 0;
	
	while( ( ie.Busy ) || ( ie.readystate != 4 ) )
	{
		WScript.Sleep( step_ms );
		
		// タイムアウトか?
		total_waited_ms += step_ms;
		if( total_waited_ms >= timeout_ms )
		{
			/*log(
				"警告:タイムアウトのため,リロードします。("
				+ ie.LocationURL
					// http://blog.livedoor.jp/programlog/archives/298228.html
				+ ")"
			);*/
			
			// どこかに移動中なら,そこへの移動を再試行
			if( _url )
			{
				//log( _url + "への遷移を再試行");
				ie_goto_url( ie, _url );
			}
			else
			{
				log( "リロード中");
				
				// 移動先が明示されていなければリロード
				ie.document.location.reload( true );
				ie_wait_while_busy( ie );
			}
			
			break;
		}
	}

	WScript.Sleep( 1000 )
}
	// http://language-and-engineering.hatenablog.jp/entry/20100310/p1
	// http://language-and-engineering.hatenablog.jp/entry/20100403/p1


// ページを移動
function ie_goto_url( ie, url ){
	//log("アクセスします:" + url);
	ie.Navigate( url );
	ie_wait_while_busy( ie, url );
	//log("ページを開きました。");
	
	// IEで常にjQueryを使うか
	if( always_enable_JQuery ){
		ie_inject_jquery( ie );
	}
}


// デバッグ用
function log(s){
	WScript.Echo(s);
}



// ------------------メイン処理 ------------------



// IE起動
var ie = getIE();

// 今後の遷移先の全ページ内でjQueryによるスクレイピングを有効化
ie_enableJQuery();

// 遷移
ie_goto_url( ie, "http://www.yahoo.co.jp/" );

// スクレイピング実行
log(
	$("div#topicsfb ul.emphasis li a") // jQueryセレクタが使える
		.map(function(){ 
			return $(this).html(); 
		})
		.get()
		.join("\n")
);
続きを読む