2020年9月8日火曜日

サブ窓の起動パスをフォルダごとに指定

僕は、移動やコピーや解凍をする際は、サブ窓で処理先を指定している(参考:コピー/移動/解凍先フォルダ選択を別窓で)。

サブ窓の起動パスを、フォルダごとにリストファイルで指定できるようにする。


準備

以下を編集して取り込み。ちなみに展開に使ってるwrap_7z.jsについては、一つ前の記事を参照のこと。

KC_main    = {
\ENTER    ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
    %K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
\M ,*ifmatch !CX,%n %: *alias ppcx_cmd = *file !move ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %*getfileto()
\C ,*ifmatch !CX,%n %: *alias ppcx_cmd = *file !copy ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %*getfileto()
\U ,*ifmatch !CX,%n %: *alias ppcx_cmd = *script %0Script\wrap_7z.js,%%*extract(%n"%%%%a8FDC"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single %*getfileto()
}

_Command = {
getfileto = *ifmatch "o:e,a:d-","fileto.txt" %: *return "fileto.txt"
  %1
}

次に、起動パスを指定したいフォルダに、リストファイルのfileto.txtを用意する。例えばdownloadフォルダから、binフォルダやTempフォルダを処理先に選ぶことが多い場合は、downloadフォルダにfileto.txtをおいて、その中身を以下のようにする。

D:\bin
D:\Temp

カレントフォルダにfileto.txtがあればそれを、なければカレントフォルダパスを返すユーザーコマンドgetfiletoを使い、サブ窓のパスを変更するという仕組みになっている。

やり方

コピーの例で説明する。コピーしたいファイルにマークしてShift+C。するとサブ窓が開く。サブ窓の起動フォルダは、カレントフォルダにfileto.txtがあればそれを参照したものに、なければカレントディレクトリになる。

サブ窓で処理先のフォルダ内に移動し、Shift+Enterを押すと、先にマークしたファイルはそこにコピーされ、サブ窓は消える。


移動したい場合はShift+M、書庫を展開したい場合はShift+Uで同じようにする。

2020年9月7日月曜日

7-zip(7z.exe)で書庫の展開

以前作ったwrap_7zG.jsが機能しなくなってたのでスクリプトを見直してみた。

7-Zipを使い、複数の書庫ファイルを特定のフォルダに展開したい場合に使う。

例えばカレントフォルダに展開したい場合は、書庫ファイルをマークして以下のコマンドを実行する。

*script %0\Script\wrap_7z.js,%a8FCDN,%1

wrap_7z.js

//!*script
// 7-zipを実行して展開先フォルダにアーカイブファイルを展開する
// 第一引数: レスポンスファイル
// 第二引数: 展開先フォルダ

if (PPx.Arguments.Length < 2){
  PPx.SetPopLineMessage("引数が正しくありません。");
  PPx.Quit(-1);
}

//  7z.exeのパス
var Exec = "C:\\Program Files\\7-Zip\\7z.exe";
var responseFile = PPx.Arguments.Item(0);
var extractFolder = PPx.Arguments.Item(1);

var archiveFiles = GetList(responseFile);
// 個々のファイルごとに7-Zipで展開
for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  PPx.Execute('\"'+Exec+'\" x -o\"'+extractFolder+'\\*\" '+archiveFiles[x]);
}

// レスポンスファイルからファイル名のリストを作成
function GetList(list)
{
  var f = CreateObject("ADODB.Stream");
  
  f.type = 2;
  f.charset = "UTF-8";
  f.open;
  f.LoadFromFile(list);
  text = f.readText(-1).split("\r\n");
  f.close;
  return text;
}