目次
- 動機
- 完成したバッチファイルの全貌
- 解説
- 参考文献
1. 動機
私は、SnippingToolで切り抜いた画像をpngファイルとして保存するとき、
- Windowsの「ペイント」を立ち上げて
- 切り抜いた画像をペーストして
- 「名前を付けて保存」を選んで
- 画像の保存場所とファイル形式を選ぶ
...という工程をいつも踏んでいました。
地味にめんどくさい!
やりたくない!
そこで、SnippingToolで切り抜いた画像を即保存してくれるバッチファイルを作ることにしました。
2. 完成したバッチファイルの全貌
rem 全コマンドを表示しないようにする
@echo off
rem バッチファイル自身を再帰的に呼び出し、最小ウィンドウで実行する
if not "%~0"=="%~dp0.\%~nx0" (
start /min cmd /c,"%~dp0.\%~nx0" %*
goto :eof
)
rem PowerShellスクリプトファイルを実行する
powershell -ExecutionPolicy RemoteSigned -File "SnipSavingTool.ps1"
# クリップボードに保存してあるものを $img に代入する
$img = Get-Clipboard -Format Image
# $img を名前つけて保存する
If ($img -ne $null) {
$date_time = Get-Date -Format yyyyMMdd_HHmmss
$img.Save("$date_time.png")
[System.Windows.Forms.MessageBox]::Show("保存成功!","Result")
} Else {
[System.Windows.Forms.MessageBox]::Show("たぶん画像じゃない","Result")
}
3. 解説
全コードをバッチファイル1つに収めなかった理由
結論から言うと、バッチファイルの見た目が汚くなるからです。
一応バッチファイル1つに収めることは可能です。
しかし、クリップボード内のデータ取得にはPowerShellのコマンドを使うので[1]、バッチファイルの全行にpowershell -Command
と書かなくちゃいけません[2]。
めんどいしコードが汚くなりそうなので、「バッチファイルでPowerShellスクリプトファイルを実行する」ことにしています。
3.1 SnipSavingTool.bat の中身
@echo off
-
echo off
・・・echo off 以降のコマンドがコマンドプロンプト上に表示されなくなる。 -
@echo off
・・・echo off 自身すらも表示されなくなる。
if not[3]
-
if not A==B <command>
・・・AとBが等しくないとき、commandが実行される。
"%~0"=="%~dp0.%~nx0"
-
%0
[4]・・・(例 "C:\Users\taro\Desktop\SnipSavingTool.bat") -
%~0
[4]・・・「%0」から「""」を除く(例 C:\Users\taro\Desktop\SnipSavingTool.bat) -
%~d0
[4]・・・「%~0」のドライブ名(例 C:) -
%~p0
[4]・・・「%~0」のパス(例 \Users\taro\Desktop\) -
%~dp0
・・・「%~d0」と「%~p0」を合わせたもの(例 C:\Users\taro\Desktop\) -
%~n0
[4]・・・「%~0」のベース名(例 SnipSavingTool) -
%~x0
[4]・・・「%~0」の拡張子(例 .bat) -
%~nx0
・・・「%~n0」と「%~x0」を合わせたもの(例 SnipSavingTool.bat) -
%~dp0.\%~nx0
・・・(例 C:\Users\taro\Desktop\ .\SnipSavingTool.bat)
start /min cmd /c "%~dp0.%~nx0"
-
start
・・・新規にコマンドプロンプトを開く。[5] -
start /min
・・・新規コマンドプロンプトをウィンドウ最小化の状態で開く。[5] -
start cmd
・・・新規コマンドプロンプトにおいて「cmd」を実行する。[5] -
cmd /c <command>
・・・command実行後、これを実行したコマンドプロンプトは終了する。[6] -
start /min cmd /c <command>
・・・新規コマンドプロンプトをウィンドウ最小化の状態で開き、command実行後、この新規コマンドプロンプトは終了する。
goto :eof[7]
バッチファイルを終了する。(EOF = End Of File)
powershell -ExecutionPolicy RemoteSigned -File "SnipSavingTool.ps1"[8]
管理権限を無視して "SnipSavingTool.ps1" を実行する。
3.2 SnipSavingTool.ps1 の中身
$img = Get-Clipboard -Format Image
-
$img
・・・PowerShellで変数を宣言するとき、またはコマンドなどで使用するときは、変数名の頭に「$」をつける。[9] -
Get-Clipboard -Format Image
[10][11]・・・クリップボード内に保存されている画像データを取得する。
$img -ne $null
-
A -ne B
[12]・・・AとB等しくないときに「$True」を返す。
$date_time = Get-Date -Format yyyyMMdd_HHmmss
$img.Save("$date_time.png")
-
A.Save(B)
・・・AをBに保存する。[15]
[System.Windows.Forms.MessageBox]::Show()[16][17]
指定した形式でメッセージボックスを表示させる。
指定方法は [17] を参照。
4. 参考文献
[1] ASCII.jp:Windowsの基本機能 クリップボードをさらに活用する
[2] コマンドプロンプトから PowerShell を実行する - Qiita
[3] if(条件分岐)
[4] バッチファイルで引数を使う
[5] start - Windowsコマンド虎の巻
[6] Cmd - DOS/コマンドプロンプト コマンド一覧 - Programming Field
[7] コマンドプロンプト | ラベルの位置へ制御を移す(GOTO)
[8] 管理権限を持っていないユーザーで PowerShell スクリプトを実行する
[9] 変数について - PowerShell | Microsoft Learn
[10] PowerShellメモ クリップボード操作 - Qiita
[11] Get-Clipboard (Microsoft.PowerShell.Management) - PowerShell | Microsoft Learn
[12] PowerShell で If 文を利用した条件分岐を行う | マイクロソフ党ブログ
[13] Get-Date (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
[14] 【Get-Date】PowerShellで現在の日付や時刻を取得する方法とは?フォーマットの変更は? | チェシャわら
[15] PowerShell 使い方メモ - Qiita
[16] PowerShellでメッセージボックスを使う4つの方法 - 適材適所
[17] 【PowerShell】MessageBoxを使用する | 秋拓技術学院