ツールの整理へのコンソールアプリの追加No.10570
フリーバード さん 23/01/11 18:36
 
ツールの整理で、コンソールアプリをシンプルに登録する方法を教えていただけない
でしょうか?

ファイルを展開する以下のようなコマンドを登録したいと考えています。

C:\ProgramData\chocolatey\bin\7z.exe x %1

過去の投稿を検索して

vbs:CreateObject("Shell.Application").ShellExecute "C:\ProgramData\chocolate
y\bin\7z.exe","x",getNextItem(-1,1)

みたいな感じかと考えましたがうまくゆかないため
よろしくお願いいたします。

[ ]
RE:10570 ツールの整理へのコンソールアプNo.10575
秀丸担当 さん 23/01/12 10:14
 
chocolateyというのはちょっとわからないですが、Program Filesにインストールさ
れているとして、x %1でやってみたら確かにうまくいきませんでした。
作業フォルダが決まっていないためのようです。
-oを使って、以下のようにしてみたらできました。

"C:\Program Files\7-Zip\7z.exe" x -o"%d" %1

vbsでこのコマンドライン相当にするとしたら以下のようになりますが長いです。

vbs:CreateObject("Shell.Application").ShellExecute "C:\Program Files\7-Zip\7
z.exe","x -o"""+getDirectory()+""" "+getItemPath(getNextItem(-1,2))

ShellExecuteは第3パラメータに作業フォルダを指定することができるので、-oを使
わなくてもいけました。

vbs:CreateObject("Shell.Application").ShellExecute "C:\Program Files\7-Zip\7
z.exe","x "+getItemPath(getNextItem(-1,2)),getDirectory()

もっと簡単には、コンテキストメニューの項目をボタン化する方法があります。
通常のインストーラを使ったProgram Filesへのインストールでは、zipファイルを右
クリックすると、7-Zipというサブメニューができると思います。
これを直接呼ぶボタンにできます。
zipファイルを選んだ状態で、ブックマークの追加をして、パスの右側の>>ボタンか
ら、[コマンド(コンテキストメニュー)(7)...]を選びます。
そうするとzipファイルに対するコンテキストメニューの候補が出るので、その中か
ら選ぶとできます。
7-Zipの展開は、
js:ContextMenu("SevenZipExtract");
や、
js:ContextMenu("SevenZipExtractTo");
といったものになるようです。
7zipは代表的な展開ソフトなので、スクリプトのサンプルのところにも書いておこう
と思います。

chocolateyというのはわからないですが、最近のWindowsでは、wingetというコマン
ドでパッケージ的にインストールできたりするみたいです。
コマンドプロンプトで、
winget install -e --id 7zip.7zip
とすると、管理者のインストールが出てきてコンテキストメニューにも追加されまし
た。

[ ]
RE:10575 ツールの整理へのコンソールアプNo.10576
フリーバード さん 23/01/12 11:06
 
詳しい解説ありがとうございます。
原因が作業フォルダだったとは、失礼しました。
簡単な方法も助かります。

複数のプログラムをまとめてインストールしたり、アップデートすることを目的にパ
ッケージマネージャーを使っています。

chocolety
https://chocolatey.org/

scoop
https://scoop.sh/

[ ]
RE:10576 ツールの整理へのコンソールアプNo.10577
フリーバード さん 23/01/12 18:34
 
処理結果の表示と画面の更新をしたかったのでスクリプトにしてみました。

// unpack.js  for Hidemaru Filer Classic

var SUCCESS = 0;
var execCommand = "cmd /c C:\\ProgramData\\chocolatey\\bin\\7z.exe x -o" + g
etDirectory() + " " + getItemPath(getNextItem(-1,2));
exec = new ActiveXObject("WScript.Shell").exec(execCommand);
var stdOut = exec.StdOut.ReadAll();
var stdErr = exec.StdErr.ReadAll();
var exitCode = exec.ExitCode;
exitCode === SUCCESS ? message(stdOut) : message(stdErr);
refresh(4);

[ ]