Skip to content

Instantly share code, notes, and snippets.

@aya-eiya
Created March 6, 2012 14:41
Show Gist options
  • Save aya-eiya/1986622 to your computer and use it in GitHub Desktop.
Save aya-eiya/1986622 to your computer and use it in GitHub Desktop.
便利コマンドバッチ集(ファイルサイズ取得/MD5取得/JScript正規表現置換/etc..)

コマンドバッチ集 README.md

幾つかの便利コマンドバッチをおいています。

Cygwinなどを入れられない環境において、コマンドライン作業を便利にします。

インストール

c:\cmd

を作成して環境変数PATHにc:\cmdを追加してください。

その後、c:\cmdにこのコマンドバッチ集を配置しておけば、 コマンドプロンプト上から以下のコマンドバッチを実行することが 出来るようになります。

putSize.bat

ファイルサイズ取得

putSize.bat filename

として使います。 標準出力に、

ファイル名 バイトサイズ

の形式で出力します。

依存関係

なし

getSizeList.bat

ファイルリスト&サイズ取得

getSizeList.bat dirname

として使います。 指定したディレクト配下のツリーに所属するサブファイルについて、

ファイル名 バイトサイズ

の形式でリストを取得します。

依存関係

  • putSize.bat

getPath.bat

PATH検索コマンド

getPath.bat mypath cmd.exe

として使います。

第一引数に環境変数名、第二引数にPATH上から検索したいコマンドを指定します。 検索の結果は、第一引数に指定した環境変数名に格納されます。 第一引数の名前に%をつけてはいけません。

上記の例では、実行後に環境変数mypathが次のようになっています。

echo %mypath% C:\WINDOWS\system32\cmd.exe

PATH上に特定のファイルがあるかどうかや、PATHに指定されたどのディレクトリに ファイルがあるかを調べるときに使います。

劣化版whichコマンドです。

依存関係

なし

getMD5.bat

MD5値の取得

getMD5 filename

または、ディレクトリ名dirnameに対して、

getMD5 dirname

として使います。

ファイルを指定した場合は、そのファイルのMD5値を標準出力に、

md5 (filename) = md54bafd9e808ba77d6d74a4556b0md5

として出力します。

ディレクトリを指定した場合は、そのディレクトリ配下の標準出力に、

md5 (subfilename1) = md54bafd9e808ba77d6d74a4556b0md5 md5 (subfilename2) = md54ebaba7fd9808cd6a455d746b0md5 : :

のリスト形式で出力します。

依存関係

  • MD5cmd.js
  • cscriptコマンド(WSH)
  • .NET FW 3.x
  • getPath.bat

MD5cmd.js

getMD5.batのコアスクリプトファイル

単体で使ってはいけません。 説明は省略します。

依存関係

  • cscriptコマンド(WSH)
  • .NET FW 3.x

replaceJS.bat

JScript正規表現置換機能の提供

Hello world!と記載されているファイルhello.txtに対して、

replaceJS "/^hello/i" "Good bye" hello.txt

または、標準出力からの入力に対して

echo Hello world! | replaceJS "/^hello/i" "Good bye"

として使用します。

上記の結果は、いずれも、

Good bye world!

と標準出力に出力します。

コマンドプロンプトにJScript正規表現置換機能を提供します。

正規表現を用いて文字列の処理を行いたいときに使用します。

echo Hello Taro! | replaceJS "/^hello (\w+)/i" "Good bye $1 san"

のように、一致部分を利用した置換や、パイプでつなげて複雑な文字列処理を 行うこともできます。

上記一致部分の利用の例は、

Good bye Taro san!

と出力します。

クセが強いので複雑なことをしようとすると苦労します。 ただし、ちょっとしたことが楽になります。

依存関係

  • replace.js
  • cscriptコマンド(WSH)
  • getPath.bat

replace.js

replaceJS.batのコアスクリプトファイル

単体で使ってはいけません。 説明は省略します。

依存関係

  • cscriptコマンド(WSH)

ライセンス/免責

このソフトウェアは完全に無償で利用できます。

このソフトウェアのソースコードは自由に改変・再配布していただいてかまいません。

ただし、ソースコードの著作権はaya_eiyaに帰属しています。

ソフトウェアの使用の結果生じたいかなる損害についても、aya_eiyaは責任を負いません。 各人および各組織の責任において使用してください。

(C) aya_eiya 2012

@echo off
REM getMD5.bat
REM (C) aya_eiya 2012
if "%~1" == "/?" goto :help
if "%~1" == "" goto :help
goto :main
:help
echo Usage)
echo call getMD5 files^|dirs [exclude_regExp]
echo files^|dirs = ^"file1^|dir1;file2^|dir2;...^"
goto end
:main
set PGM_NAME=MD5cmd.js
call getPath PGM_PATH %PGM_NAME%
IF "%PGM_PATH%" == "" set PGM_PATH=%PGM_NAME%
set DIRS=%~1
set OPT=-exclude "%~2"
IF "%~2" == "" set OPT=
IF NOT EXIST %DIRS%\nul GOTO callMD5cmd
setlocal
%~d1
cd %1
set DIRS=
for /f "usebackq tokens=*" %%i in (`dir /B /S /A-D`) do (
set DIRS=%%i
call :callMD5cmd
)
goto end
:callMD5cmd
call cscript /Nologo "%PGM_PATH%" "%DIRS%" %OPT%
:end
@echo off
REM getPath.bat
REM (C) aya_eiya 2012
set %1=%~dpnx$PATH:2
@echo off
REM getSizeList.bat
REM (C) aya_eiya 2012
setlocal
if not exist "%~1" goto lbled
for /f "usebackq tokens=*" %%i IN (`dir /S /B /A-D "%~1"`) DO (
call putSize "%%i"
)
:lbled
// MD5cmd.js
// (C) aya_eiya 2012
(function (){
function readBinaryFile(FileName){
var streamObj = new ActiveXObject("ADODB.Stream");
var resultObj = null;
streamObj.Type = 1;
streamObj.Open();
streamObj.LoadFromFile(FileName);
resultObj = streamObj.Read();
streamObj.Close();
return resultObj;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileNames = new Array();
var fileName = "";
var i = 0;
var j = 0;
var md5 = new ActiveXObject("System.Security.Cryptography.MD5CryptoServiceProvider");
var msxml = new ActiveXObject("MSXML2.DOMDocument");
var element = null;
var md5Value = "";
var ecode = 0;
var exclude = /^$/;
var excludeParaNum = -2;
if( WScript.Arguments.length > 0 ){
for(i=0;i<WScript.Arguments.length-1;i++){
if(WScript.Arguments.item(i) == "-exclude"){
exclude = eval(WScript.Arguments.item(i+1));
excludeParaNum = i;
break;
}
}
for(i=0;i<WScript.Arguments.length;i++){
fileNames = WScript.Arguments.item(i).split(/[;,]|\r\n|\n/);
for(j=0;j<fileNames.length;j++){
fileName = fileNames[j];
if( ( excludeParaNum == i || excludeParaNum+1 == i ) || fileName == "" || fileName.match(exclude) ) continue;
try{
if(fso.GetFile(fileName).Size == 0){
md5Value = "d41d8cd98f00b204e9800998ecf8427e";
}else{
md5.ComputeHash_2(readBinaryFile(fileName));
element = msxml.createElement("tmp");
element.dataType = "bin.hex";
element.nodeTypedValue = md5.Hash;
md5Value = element.text;
}
}catch(e){
ecode = e.number & 0xffff;
WScript.StdErr.WriteLine("Error:" + ecode);
WScript.StdErr.WriteLine("[E]" + e.description + "(filename = " + fileName+ ")");
md5Value = "**********************************";
}
WScript.StdOut.WriteLine("md5 (" + fileName + ") = " + md5Value );
}
}
}
})();
@echo off
REM putSize.bat
REM (C) aya_eiya 2012
setlocal
set result="%~1" (FILE NOT FOUND)
if not exist "%~1" goto end
set result="%~1" %~z1
:end
echo %result%
// replace.js
// (C) aya_eiya 2012
(function (){
var fstream = null;
if(WScript.Arguments.length == 2 && !WScript.StdIn.AtEndOfStream){
// 標準入力を変換
fstream = WScript.StdIn;
}else if(WScript.Arguments.length == 3 ){
var fileName = WScript.Arguments.item(2);
var fso = new ActiveXObject("Scripting.FileSystemObject");
if( fso.FileExists(fileName) ){
fstream = fso.OpenTextFile(fileName);
}else{
WScript.StdErr.WriteLine(fileName + " is not a file.");
WScript.Quit(1);
}
}
if(fstream != null){
var regExp = eval(WScript.Arguments.item(0));
var repStr = WScript.Arguments.item(1);
try{
WScript.StdOut.Write( fstream.ReadAll().replace(regExp,repStr) );
fstream.Close();
}catch(e){
WScript.StdErr.WriteLine("Error:" + e.number & 0xffff);
WScript.StdErr.WriteLine("[E]" + e.description );
WScript.Quit(1);
}
}else{
WScript.StdOut.WriteLine("[Error]Wrong parameters.");
WScript.Quit(2);
}
})();
@echo off
REM replaceJS.bat
REM (C) aya_eiya 2012
set PGM_NAME=replace.js
call getPath PGM_PATH %PGM_NAME%
IF "%PGM_PATH%" == "" set PGM_PATH=%PGM_NAME%
call cscript /Nologo "%PGM_PATH%" %*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment