本文へスキップ
  [MENU]

★TestUtility  〜 テスト支援ツール 〜

★PowerShellコマンド集

★サンプルコマンド(バッチ)集

 ◆◇PowerShellコマンド集◆◇
  compObj.ps1

[使い方] compObj.ps1 "test1.txt" "test2.txt"

# オブジェクト比較
param($a, $b)
$obja = Get-Content $a
$objb = Get-Content $b
Compare-Object $obja $objb
  countChar.ps1

[使い方] countChar.ps1 "test1.txt"

# テキストファイルの行数や文字数などをカウントする
param($a)
$txt = Get-Content $a
$txt | Measure-Object -Line -Character -Word | Format-List Characters,Lines,Words
  getFolderSize.ps1

# ファイル単位じゃなくフォルダ単位で容量一覧を作成する
Get-ChildItem `
| Select-Object Name, @{ name = "Size"; expression = { `
[math]::round((Get-ChildItem $_.FullName -Recurse -Force `
| Measure-Object Length -Sum `
).Sum /1MB ) `
} }
  getWorkingSetInfo.ps1

# ワーキングセットのサマリーを表示する
get-process | measure-object -property workingset -minimum -maximum -average
 
◆◇サンプルコマンド(バッチ)集◆◇

:YMDHH24MISS 前回実行時刻を取得
:FORFILES 指定した日数より古いファイルを削除
:SHIFT ドラッグ&ドロップでファイル名やファイルパスを出力
:PING 何分後に実行をサクッと実現
:ERRORLEVEL エラーの拾い方
:FOR 繰り返し文の使い方
:PARAM 受け取ったファイルから取得するものの選び方(サイズ、ファイル名、拡張子等)
:GREP GREP検索もどき(指定したフォルダ内のファイルすべてに対して全文検索)
:LOG リダイレクト機能を利用したログの書き方サンプル
:COLOR コマンドプロンプトの背景色変更
:SVN 任意のフォルダをSVN更新した上で所定のフォルダにバックアップを作成
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:YMDHH24MISS


rem 前回実行時間を取得
rem iniファイルの記載 2016/09/01 12:23:28
for /f "tokens=1,2" %%A in (%BAT_PATH%\ZENKAIJIKOKU.ini) do (set YMDHH24MISS=%%A %%B)

簡単そうで意外とはまったのでメモしときます↓

if "%ERRORLEVEL%"=="0" (echo %DATE% %TIME:~0,2%%TIME:~2,2%%TIME:~4,4% > %BAT_PATH%\ZENKAIJIKOKU.ini) else (goto END)
  ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:FORFILES


古いバックアップファイルとかを一気に削除したい!
そんなあなたに必要なバッチはこれ↓↓
サンプルコマンド(バッチ)
----------------------------------------------------------------------
@echo off
rem 対象ディレクトリ
set DELDIR=D:\tmp
rem 削除対象ファイルの拡張子
set FILETYPE=zip
rem 何日前のファイルを削除
set NUM=3
forfiles /P %DELDIR% /M *.%FILETYPE% /D -%NUM% /C "cmd /c if @isdir==FALSE echo /s @path"
set/p INP="削除して問題ない場合は y を入力してください>>"
IF "%INP%"=="y" (goto DEL-FILE) else (goto END)
:DEL-FILE
forfiles /P %DELDIR% /M *.%FILETYPE% /D -%NUM% /C "cmd /c if @isdir==FALSE del /s @path"
:END
pause
----------------------------------------------------------------------
FORFILESコマンドは恥ずかしながら最近知りました
これまで日数指定でファイルを削除するときはVBScriptをつかっていましたが、
これからはこのコマンドしか使わないでしょう
ちなみにforfilesを何も引数無しで実行すると、
現在のフォルダーにあるファイルやフォルダーの一覧が表示され、
/sオプションを付けると、サブフォルダーも含めた一覧が表示されるようです
  ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:SHIFT


選択したフォルダやファイルのパスをコピーしたいとき、
「スタート」
>「プログラムとファイル名を検索」
>「shell:sendto」と入力
>SendToフォルダ
に以下のバッチを入れておくと非常に便利です☆

サンプルコマンド(バッチ)
-------------------------------------------------------------------------------
@echo off
rem color F5 背景:白色/文字:紫色
color F5

rem 引数を確認し、NULLでなければファイルパスを表示
:CHECK
if "%1"=="" goto END
echo %1
shift
goto CHECK

:END
pause
-------------------------------------------------------------------------------

これさえあれば、
フォルダ・ファイルを選択
>右クリック
>「送る」
>上記バッチ
でコマンドプロンプト上にパスを出力できます。
コンソール上のパスは右クリックの「範囲指定」でコピーできます◎

「 shift 」 ← バッチプログラムにおいて、パラメーター「%0」〜「%9」を一つずつ小さい方に番号をずらします。
  ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:PING


30分後、上手く処理が流れていたら皆にメールを送っておこう
10分したらファイルのバックアップをはじめよう
5分後にコンピュータをシャットダウンしよう   等々

元のプログラムにあらかじめ追加したり、
タスク(スケジューラ)に登録したりするのは意外と面倒ですよね

そんなときに重宝するのが以下のような簡易バッチ

実行したいプログラムと実行時間を入力するだけの超お手軽プログラムですので
デスクトップに置いておくのはアリかなと思います☆
-------------------------------------------------------------------------------
@echo off

set/p PID="実行したいプログラム(フルパス)を入力してください>>"
echo.
set/p TID="何分後に実行しますか?(X分 → Xを数字で入力してください)>>"
echo.

rem 分(mm)を秒(ss)に変換
set /A TIMER=%TID% * 60

rem 指定した回数pingコマンドを投げ続けます(pingコマンドは1コマンド1秒)
ping localhost -n %TIMER% > nul

call %PID%

pause
-------------------------------------------------------------------------------

「ping」 ← 本来、ネットワークの疎通を確認する際に利用します。
「set /A」 ← 変数の代入時に数式を利用できるようにします。
  ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:ERRORLEVEL


ERRORコマンド

処理が正しく行われたか確認したい
又、失敗したらそこで処理を止めたい。。。

そんなときに利用するのがERRORコマンド!

プログラムによりますが、ちゃんと戻り値を設定しているものであれば
0〜255?の間の数値で、実行結果(エラーコード)を返します

サンプルコマンド(バッチ)
-------------------------------------------------------------------------------
@echo off
rem color F5 背景:白色/文字:紫色
color F5

call TESTCMD

echo 処理内容:call TESTCMD 返り値:%ERRORLEVEL% > log.txt

rem チェンジディレクトリ
cd..
rem カレントディレクトリへ移動する
pushd %0\..

echo 処理内容:cd.. pushd %0\.. :%ERRORLEVEL% >> log.txt

echo ERRORLEVELの確認中... > sample.txt

call notepad sample.txt

echo 処理内容:call notepad sample.txt 返り値:%ERRORLEVEL% >> log.txt

rem 処理の後、即座にエラー判定⇒分岐処理を行いたい場合は
rem 下記のようなIF分を処理直後に挿入↓↓
if %ERRORLEVEL%==1 goto ERROR

exit

:ERROR
echo 異常終了!!

pause

:END
-------------------------------------------------------------------------------

「if %ERRORLEVEL%==1 goto ERROR」
↑実行結果(エラーコード)が 1 だったら ERRORセクションに飛ぶ

「pushd %0\..」←ドライブをまたいでカレントディレクトリの移動ができる大変便利なコマンド(この場合、現在実行中のバッチが配置されているディレクトリをカレントに設定できる)
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:FOR


if文とfor文。プログラムで最もメジャーな処理。
バッチプログラムでは殊更よく使います☆

設定ファイルを一行ずつ読み込んでただ表示するだけであればこう↓
for /f %%a in (%~dp0表示サンプル.txt) do echo %%a

カンマ区切りで読み込んで、3つ目だけ表示するならこう↓
for /f "delims=, tokens=1,2,3" %%a in (%~dp0表示サンプル.txt) do echo %%c

2つ目が”A”だったときだけ3つ目を表示する↓
for /f "delims=, tokens=1,2,3" %%a in (%~dp0表示サンプル.txt) do if "%%b" == "A" echo %%c

せっかくですので、意外と便利な2行のコマンドを以下に記載します。
for /f "delims=/ tokens=1,2,3" %%a in ('date /t') do set DAYTIME=%%a%%b%%c
mkdir C:\%DAYTIME%

↑何をやっている?日付名称のフォルダをC直下につくるコマンドです。

サンプルコマンド(バッチ)
-------------------------------------------------------------------------------
@echo off
rem color 80 背景:灰色/文字:黒色
color 80

rem 現在日付データを"/"で区切って1つ目(年)を a に、2つ目(月)を b に、3つ目(日)を c に格納する
for /f "delims=/ tokens=1,2,3" %%a in ('date /t') do set DAYTIME=%%a%%b%%c

rem Cドライブ直下に日付のフォルダを作成する
mkdir C:\%DAYTIME%

pause

:END
-------------------------------------------------------------------------------

「delims=」 ← ”=”の後ろの文字で読み込んだ文字列を区切ります。
「tokens=1,2,3,,,」 ← 文字区切りして読み込んだ引数をいくつ保持するかを指定します。
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:PARAM


バッチパラメータ。パラメータ、引数という言葉はエンジニアが最初に魅了される?言葉の一つではないでしょうか。

本日は、"パラメータ"注目して一つサンプルバッチを作ります。
("バッチパラメータ"、"修飾子"といった言葉でググればより詳しい情報を確認できます。)

サンプルコマンド(バッチ)
-------------------------------------------------------------------------------
@echo off
rem color 80 背景:灰色/文字:黒色
color 80

set PARAM=
set PARAM=%~z1

rem パラメータ(引数)を確認します
rem 渡されたファイルのサイズが0バイトより大きければ警告メッセージを出します
if "%PARAM%" GTR "0" (echo "空じゃない") else (echo "空っぽ")

pause

:END
-------------------------------------------------------------------------------

上記のbatファイルを作成したら、適当なファイルをドラッグ&ドロップしてみてください。
"0"の部分を書き換えれば任意のサイズ分岐が可能になります。

テキストファイルの見た目から、バイトサイズを予想するゲームなんかしても面白いかも。。。

%1 → "D:\tool\hakomono test.txt"
ファイル名に半角スペースがあるため、ダブルクォーテーション
が両端についている
%~1 → D:\tool\hakomono test.txt
ダブルクォーテーションがはずれる
%~d1 → D:
ドライブ名のみ
%~p1 → \tool\
フォルダ名のみ
%~n1 → hakomono test
ファイル名のみ ※拡張子なし
%~x1 → .txt
拡張子のみ
%~a1 → --a------
ファイル属性を取得
%~t1 → 2013/03/10 02:05
ファイル更新日時を取得
%~z1 → 328
ファイルサイズを取得
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:GREP


メジャーなテキストエディタではお馴染みの”grep”検索

ウィキペディアでは「ファイル全体から (global) 正規表現 (regular expression) に一致する行を表示(print)する」の略と説明があります。

今回は”grep”もどきのバッチファイルをつくってみましょう

正規表現の検索はvbsに頼らないと実現できないので、あくまでgrepもどきの簡易バッチですが、
指定したフォルダ内のすべてのテキストファイルから、検索したい文字列を含む行を抽出するプログラムを書いてみます。

サンプルコマンド(バッチ(1))↓ ※ファイル名称:grep.bat / 今回は2つバッチを作ります!
-------------------------------------------------------------------------------
@echo off
rem color 1D 背景:青色/文字:ピンク色
color 1D

rem grep検索対象のファイル一覧を作成します
set/p INP="検索対象のフォルダパスを入力してください>>"
echo.

dir %INP% /b > 検索対象ファイル一覧.txt

:FIND-TXT

set TXT=
set/p TXT="検索したい文字列を入力してください>>"
echo.

echo ↓↓↓↓↓↓[ 検索結果 ]↓↓↓↓↓↓ > %TXT%_grep結果.txt

echo 検索対象のファイルから任意の文字列を含む行を抽出します
for /F "eol= delims=, " %%i in (%~dp0検索対象ファイル一覧.txt) do (if "%%i"=="" (goto END) else (call doGrep.bat %%i))

set OPE=
set/p OPE="別の文字列でも検索しますか?(y/n)>>"
echo.
if "%OPE%"=="y" (goto FIND-TXT) else (goto END)

:END
-------------------------------------------------------------------------------
サンプルコマンド(バッチ(2))↓ ※ファイル名称:doGrep.bat / 今回は2つバッチを作ります!
-------------------------------------------------------------------------------
@echo off
rem color 1D 背景:青色/文字:ピンク色
color 1D

if "%1"=="" (goto END) else (goto GREP)

:GREP

echo %1 実行中...
find /n /i "%TXT%" %INP%\%1 >> %TXT%_grep結果.txt
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:LOG


バッチ処理の醍醐味はやはり複数の処理をダブルクリックで一括実行できるところ

そこで必須のコマンドがリダイレクト☆
(例えば、画面に表示されるはずのデータをファイルとして出力することを「出力先をファイルにリダイレクトする」と言う。)

何の処理にどのくらい時間がかかったのか、また今何の処理をしているのかを把握するために
ログファイルをつくってみましょう

サンプルコマンド(バッチ)↓
-------------------------------------------------------------------------------
@echo off

set F_NAME=
rem バッチ処理の開始日時を記録
echo 処理開始日時: %date% %time% > log.txt

rem 日時(YYYY/MM/DD)からスラッシュをのぞいたフォルダをつくります
echo. >> log.txt
echo フォルダを作成 >> log.txt
set F_NAME=%date:~-10,4%%date:~-5,2%%date:~-2,2%
mkdir %F_NAME%

rem 処理をツラツラと。。。
echo. >> log.txt
echo なんたらかんたら。。。 >> log.txt

rem 上で作成したフォルダにログファイルを移動します
echo. >> log.txt
echo log.txt を %F_NAME% フォルダに移動 >> log.txt
move log.txt %F_NAME%

rem 処理終了日時を記録
echo. >> %F_NAME%\log.txt
echo 処理終了日時: %date% %time% >> %F_NAME%\log.txt

pause
-------------------------------------------------------------------------------

「 XXXX > ○○.txt」 ← 新たなファイルを作成した上で、XXXXの内容及び結果を記載します。
「 XXXX >> ○○.txt」 ← ○○.txtがすでにある場合、XXXXの内容及び結果を追記します。
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:COLOR


DOS窓の背景色や文字色を変更する
-------------------------------
color [背景色番号] [文字色番号]
-------------------------------

サンプルコマンド(バッチ)↓
-------------------------------------------------------------------------------
@echo off

rem color F5 背景:白色/文字:紫色
color F5
pause
rem color A1 背景:明るい緑色/文字:青色
color A1
pause
rem color DF 背景:ピンク色/文字:輝く白色
color DF
pause
rem color 1D 背景:青色/文字:ピンク色
color 1D
pause
rem color 80 背景:灰色/文字:黒色
color 80
pause
rem color E5 背景:明るい黄色/文字:紫色
color E5
pause
-------------------------------------------------------------------------------
 ┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏┏

:SVN


任意のフォルダAに対して SVN Update を実行した上で、
任意のフォルダBにファイルをアップするバッチ

サンプルコマンド(バッチ)↓
-------------------------------------------------------------------------------
@echo off
rem color F5 背景:白色/文字:紫色
color F5
rem カレントディレクトリへ移動する
pushd %0\..

rem *******************************************************
rem 下記ローカル変数をセットしてください

rem 以下のパスに対して前日日付のフォルダを作成>任意ファイルをMOVE>ローカルファイルのアップロードを行います
set SEND_PATH=C:\user01\backup

rem 以下のパスに対して SVN UPDATE を行います
set LOCAL_PATH=C:\svn\work

rem MOVE,COPY対象のファイル名称を指定
set FILE_NAME=WORK*.xls

rem *******************************************************

set MOVE_TARGET=%SEND_PATH%\%FILE_NAME%
set COPY_TARGET=%LOCAL_PATH%\%FILE_NAME%

set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)

echo 送り先: %SEND_PATH% > log.txt
echo 送り元: %LOCAL_PATH% >> log.txt

echo 処理開始日時: %date% %time% >> log.txt

rem 前日日付のフォルダを送り先に作成
mkdir %SEND_PATH%\%yy%%mm%%dd%
echo 処理内容: mkdir %SEND_PATH%\%yy%%mm%%dd% 返り値:%ERRORLEVEL% >> log.txt
if %ERRORLEVEL%==1 goto ERROR

rem 送り先の任意ファイルを前日日付のフォルダに移動
move %MOVE_TARGET% %SEND_PATH%\%yy%%mm%%dd%
echo 処理内容: move %MOVE_TARGET% %SEND_PATH%\%yy%%mm%%dd% 返り値:%ERRORLEVEL% >> log.txt
if %ERRORLEVEL%==1 goto ERROR

rem 送り元の任意ファイルを svn update
svn update %LOCAL_PATH%
echo 処理内容: svn update %LOCAL_PATH% 返り値:%ERRORLEVEL% >> log.txt
if %ERRORLEVEL%==1 goto ERROR

rem 送り元の任意ファイルを送り先にCOPY
xcopy %COPY_TARGET% %MOVE_TARGET% /Y /Z /C
echo 処理内容: xcopy %COPY_TARGET% %MOVE_TARGET% /Y /Z /C 返り値:%ERRORLEVEL% >> log.txt
if %ERRORLEVEL%==1 goto ERROR

echo 処理完了日時: %date% %time% >> log.txt

exit

:ERROR
echo 異常終了!!
echo 異常終了日時: %date% %time% >> log.txt

pause

:END

------------------------------------------------------------------------------