2021年1月17日日曜日

7-zip(7z.exe)で普通の圧縮

以前、7-zipを使って個別圧縮をできるようにした。
今回は、ファイルやフォルダをまとめて一つのアーカイブファイルにする、普通の圧縮を7-zipでできるようにする。

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

*script %0\Script\7z_unpack.js,%a*8FCDN,%1%*addchar(\)%{hoge%|.zip%} 

7z_unpack.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 destFile = PPx.Arguments.Item(1);
var sorceFiles = "";
var fso = PPx.CreateObject("Scripting.FileSystemObject");

var archiveFiles = GetList(responseFile);
var parentFolder = fso.GetParentFolderName(archiveFiles[0]);

for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  sorceFiles += fso.GetFileName(archiveFiles[x]) + " "
}
//  作業ディレクトリを変更したあと7-zipで圧縮
PPx.Execute('*cd '+parentFolder+' %: \"'+Exec+'\" a \"'+destFile+'\" '+sorceFiles);

// レスポンスファイルからファイル名のリストを作成
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;
}

2021年1月16日土曜日

カスタマイズ内容を一行編集で検索、取得

以前の記事以降、

ppcust cd filename -mask:M_*

のようにしてカスタマイズ内容の一部を出力できるようになった。これを利用し、外部ソフトなしで、一行編集によるカスタマイズ内容の検索と取得をできるようにする。
PPX.CFGをPPxフォルダに置いて、以下を編集して取込。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 editor %'temp'\cfg.txt
}

*getcfgを実行すると、PPX.CFGを補完候補リストにした一行編集が表示される。選択すると、そのIDの現在の内容がテキストファイルに出力され、それをエディタで表示する。

僕は登録しているエディタではなく、PPeを使って表示している。その際は次のようになる。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 *edit %'temp'\cfg.txt
}

追記 2021-02-10

エディタではなくPPVで表示させた方が、編集した際に保存するか否かの確認されない分いいかもなと思った。その際は次のようになる

_Command	= {	; ユーザコマンド・関数
getcfg	= %Obdsq *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 type %'temp'\cfg.txt | %0PPVW.EXE -bootid:C
}

追記 2021-03-29

最近の更新で、PPeで保存するか否かの確認を無くせるようになった。

_Command	= {	; ユーザコマンド・関数
getcfg	= %Os *string o,name=%*input("" -title:"カスタマイズ内容部分取得" -mode:e -k:"*completelist /set /file:""%%0PPX.CFG""") %:
 *ppcust cd %'temp'\cfg.txt -mask:%*regexp("%so"name"","s/^(.*)\s=.*/$1/") %:
 *edit %'temp'\cfg.txt -k *editmode -modify:silent
}

2021年1月10日日曜日

一行編集から設定ファイルを save & load

設定ファイルの保存と読込が容易にできるようにする。準備として、PPxフォルダ内にsavedataフォルダを作成しておこう。

保存は以下のコマンド

%"設定を保存します"%Ob *PPCUST CD %{%0savedata\PPX-%*nowdatetime(y-N-D)%|.CFG%}

読込は以下のコマンド。savedataフォルダ内のファイルを一行編集で表示する。

%Ob *PPCUST CS %*input("%0savedata" -title:"load cfg file" -mode:e -select:l -k:"%%K""@TAB")

使用例

僕はそれぞれ、saveとloadという名前でユーザコマンドに登録。それを「一行編集でランチャ」のl_cmd.txtに登録して呼び出している。

_Command	= {	; ユーザコマンド・関数
save	= %"設定を保存します"%Ob *PPCUST CD %{%0savedata\PPX-%*nowdatetime(y-N-D)%|.CFG%}
load	= %Ob *PPCUST CS %*input("%0savedata\" -title:"load cfg file" -mode:e -select:l -k:"%%K""@TAB")
initialize	= %Q"初期化します"%:%Ob *PPCUST CINIT
}

2021年1月8日金曜日

7-zip(7z.exe)で個別圧縮

ファイルやフォルダをまとめて一つに圧縮するのではなく、ファイルごと、フォルダごとに個別圧縮する。7zipを使用。

例えばマークファイルをカレントフォルダに個別圧縮したい場合は、以下のコマンドを実行する。

*script %0\Script\wrap_7z_a.js,%a*8FCDN,%1

wrap_7zip_a.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 fso = PPx.CreateObject("Scripting.FileSystemObject");

var archiveFiles = GetList(responseFile);
// 個々のファイルごとに7-Zipで圧縮
for (x in archiveFiles){
  if (archiveFiles[x] == ""){
    break;}
  PPx.Execute('\"'+Exec+'\" a \"'+extractFolder+'\\'+fso.GetBaseName(archiveFiles[x])+'.zip\" \"'+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;
}