Script Tips

Noah解凍先指定(vbs)
b2eによる分岐
書庫名指定b2e
デバッグモード
圧縮の際パス情報無しでファイル名だけ格納したい
sitに関連する問題
cab圧縮時、状況によっては余計なファイルを格納してしまう

Noah解凍先指定(vbs)

2chのNoahスレ(98-102)で出ました。
普段はダブルクリックでデフォルトのフォルダに展開するんだけど、時々別の場所に展開したいときがあるという使い方が主眼におかれています。
下のをテキストファイルにコピー&ペーストなどして、プログラム本体の位置を指定してお使いください。保存の際の拡張子はvbsで。
あとノートン先生が騒ぐと思いますが見ての通りウィルスではありません。適当に対処してください。

'Noah本体の場所を指定
Noah = "C:\Program Files\Noah\Noah.exe"

'渡されたファイルの処理
With Wscript
Set objParm = .Arguments
If objParm.Count = 0 Then
    .echo "ファイルをドラッグ&ドロップしてください。"
    .Quit()
End If

'展開先のフォルダを選択
set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, "展開先のフォルダを選択", 0, "c:\\")
If objFolder Is Nothing Then .Quit()

'ファイル毎にオプションをつけてNoahを起動
Set WshShell = CreateObject("WScript.Shell")
For i=0 To objParm.Count-1
    WshShell.Run Noah & " -x ""-d" & _
      objFolder.Items().Item().Path & """ """ & objParm(i) & """", 1, True
Next
End With

b2eによる分岐

色々と設定を変えて使うのにいちいちb2eを書き換えてなんていられない、という人にお勧め。
Inputダイアログとwhileを活用してダイアログを表示させます。

encode:

	(exec 
		(let m 6)
		(while (! (between 0 %m 5)) 
			(exec 
				(let m (input "第一変数")) 
				(if (= %m "") (let m 3))
			)
		)
		(let r 101)
		(while (! (between 0 %r 100)) 
			(exec 
				(let r (input "第二変数")) 
				(if (= %r "") (let r 0))
			)
		) 
		(let p (input "パスワード"))
		(if (= %p "")
			(ここに%m、%rを使った、パスワードを使わないときのcmdを書く) 
			(ここに%m、%r、%pを使った、パスワードを使うときのcmdを書く)
		)
	)

存在するSFXモジュールを自動的に判断し、作れるリストを出して数字で選択します。

sfx:
(if (find a.sfx) (let x 0…a) (let x 0))
(if (find b.SFX) (let y 1…b) (let y 0))
(if (find c.SFX) (let z 2…c) (let z 0))
(let q "使用するSFXモジュールを選択してください。" )
(if (= %x %y) 
	(if (= %x %z) (let q "sfxモジュールが見つからないので自己解凍書庫が作成できません。" ))
)
(if (= %x 0) (let x ""))
(if (= %y 0) (let y ""))
(if (= %z 0) (let z ""))
(let s (input "%q %x %y %z"))
(if (= %q "使用するSFXモジュールを選択してください。" ) 
	(exec
		(if (= %s "") (let s 0))
		(if (= %s 0) 
			(exec 
				(let t (find a.sfx)) 
				(%tを使って自己解凍書庫を作るcmdを書く)
			)
		)
		(if (= %s 1) 
			(exec 
				(let t (find b.SFX)) 
				(%tを使って自己解凍書庫を作るcmdを書く)
			)
		)
		(if (= %s 2) 
			(exec 
				(let t (find c.SFX)) 
				(%tを使って自己解凍書庫を作るcmdを書く)
			)
		)
	)
)

書庫名指定b2e

書庫名が指定できます。
Noah.iniに、 Kill=使いたくない内蔵ルーチンを書き加えてください。
L … Unlha32
z … Zip32j
C … Cab32
T … Tar32
B … Bga32
Y … Yz1

#zip.b2e

load:
 (name Zip32j.dll)
 (type zip store *normal password)

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (let a %"%d%n.zip%")

 (if (method 1) (cmd -rS0  %a (resp@ (list\*.*))))
 (if (method 2) (cmd -rS9  %a (resp@ (list\*.*))))
 (if (method 3) (cmd -rS9e %a (resp@ (list\*.*))))

sfx:
 (cmd --sfx (arc))

bza.gza.b2e

load:
 (name Bga32.dll)
 (type bga gzip *bzip2)

check:
decode:
 (cmd x -a (arc))
decode1:
 (cmd x -a -i -o (arc) (list))

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (let e (if (method 1) .gza .bza))
 (let a %"%d%n%e%")
 (cmd a -r -a %a (resp@ (list\*.*)))

sfx:
 (cmd s (arc))

cab.b2e

load:
 (name Cab32.dll)
 (type cab MSZIP *LZX21)

check:
decode:
 (cmd -x (arc))
decode1:
 (cmd -x -i -o (arc) (list))

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (let a %"%d%n.cab%")

 (if (method 1) (cmd -a -r -mz %a (resp@ (listr))))
 (if (method 2) (cmd -a -r -ml:21 %a (resp@ (listr))))

sfx:
 (cmd -f (arc))

lzh.lhs.lha.b2e

load:
 (name Unlha32.dll)
 (type lzh lh5 lh6 lh7)

check:
decode:
 (cmd x -a1 -jf0 (arc))
decode1:
 (cmd x -a1 -jf0 -p1 -n -gm -- (arc) (list))

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (let a %"%d%n.lzh%")

 (if (method 1) (cmd a -d -jso1 -jm2 %a (resp@ (list))))
 (if (method 2) (cmd a -d -jso1 -jm3 %a (resp@ (list))))
 (if (method 3) (cmd a -d -jso1 -jm4 %a (resp@ (list))))

sfx:
 (cmd s -gw3 -x1 (arc))

tar.tgz.tbz.gz.bz2.z.taz.rpm.deb.ar.b2e

load:
 (name Tar32.dll)
 (type tar normal *gzip bzip2)

check:
decode:
 (cmd -xvf (arc))
decode1:
 (cmd --check-all-path=1 --display-dialog=0 -xvf (arc) (list))

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (if (method 1) (let e .tar))
 (if (method 2) (let e .tgz))
 (if (method 3) (let e .tbz))
 (let a %"%d%n%e%")

 (if (method 1) (cmd -cvf  %a (resp@ (list\*.*))))
 (if (method 2) (cmd -cvfz %a (resp@ (list\*.*))))
 (if (method 3) (cmd -cvfB %a (resp@ (list\*.*))))

yz1.b2e

load:
 (name Yz1.dll)
 (type yz1 normal password)

check:
decode:
 (cmd x (arc))
decode1:
 (cmd x -y -z -i2 -- (arc) (list))

encode:
 (let d (arc d))
 (let n (input "圧縮するファイル名を決めて下さい(拡張子不要)。" (arc. n)))
 (let a %"%d%n.yz1%")

 (if (method 1) (cmd c -- %a (list)))
 (if (method 2) (cmd c -p -- %a (list)))

sfx:
 (cmd s (arc))

デバッグモード

「letの後ろに複数個文字を書いたら全部つなげて変数に入れる」…という非公開仕様でもって、b2eのデバッグに使ってみたりすることも可能。

(let x a -d -jso1 -jm2 (arc.lzh) (list))
(input "こんなコマンドを送ろうとしています。" %x)
(cmd a -d -jso1 -jm2 (arc.lzh) (list))

ただし、ver 3.141 以降でもこの手が使える保証はいたしません。

圧縮の際パス情報無しでファイル名だけ格納したい

詳細失念。使えば分かると思います。

#lzhnp.b2e

load:
(name Unlha32.dll)
(type lzh lh5_noPath)

encode:
(cmd a -r2 -x0 -a2 -jso1 -- -jm2 (arc.lzh) (list))

sfx:
(cmd s -gw3 (arc))

#zipnp.b2e

load:
(name Zip32j.dll)
(type zip store_noPath)

encode:
(cmd -rS0j (arc.zip) (list\*.*))

sfx:
(cmd --sfx (arc))

sitに関連する問題

sitは基本的にStuffIt Expanderを使う必要があります。
昔はunstuff.exeで出来たためNoahで対応出来ましたが、sit書庫の仕様が変更されたので非常に対応が難しくなりました。
以下のは古い情報ではありますが一応載せておきます。が、正直なところ実行しないで欲しいです。今後の発展のための参考程度に考えてください。

sit.sea.bin.hqx.b2e

load:
(name Expander.exe)

decode:
(xcmd reg add "%"HKCU\Software\Aladdin Systems\Expander\Destination%"" /v DestinationDir /t REG_SZ /d (dir) /f)
(cmd (arc))

これでBINを解凍するには内蔵Cptルーチンを切る必要があります>kill=c
ただしreg.exeがある環境(XP)限定です。
Expander.exeはコマンドラインオプションを受け取らないので、
reg.exeでレジストリを書き換える以外Noah側で解凍先を指定することはできません。
あるいは決まった場所にフォルダ付きで解凍させて、そのフォルダごと好きな場所に移動するようにするか。(xcmd move …)
しかしここまでする必要があるならそのEXEはNoahには向いていないということ。
解凍先指定をあきらめるならxcmdの行は必要ないです(reg.exeも必要ありません)。

関連づけは、sit.b2e入れて、Windows拡張>関連付け>他(その他の形式で関連づけ)で設定。
b2eはWin2000SP3ならdecode:の一行目は必要ありません。
一度Expander.exeを単独起動させて、解凍オプション設定を決め打ちしておきます。
Expander.exeに渡したい拡張子はsit.sea.bin.hqx.b2eのようにファイル名で調節してください。
Expander.exeは7.0E以降の最新版を。

cab圧縮時、状況によっては余計なファイルを格納してしまう

バグ修正用 cab.b2e。
使うときには Kill=C をお忘れ無く。

load:
(name Cab32.dll)
(type cab MSZIP *LZX21)

check:

decode:
(cmd -x (arc))

decode1:
(cmd -x -i -o (arc) (list))

encode:
(cmd -a (if (method 1) -mz -ml:21) (arc.cab) (resp@ (listr)))

sfx:
(cmd -f (arc))