nsis是常用的製作軟體安裝程式的工具,因其功能強大而很受歡迎。但很多軟體都有自己的檔案,這些檔案往往有獨特的字尾名,而且往往需要支援雙擊檔案即可開啟。這時就需要對檔案字尾名進行關聯。
dos下關聯檔案字尾名常用的指令是assoc
和ftype
。
我們可以看到這兩個指令的幫助內容:
顯示或修改副檔名關聯
assoc [.ext[=[filetype]]]
.ext 指定跟檔案型別關聯的副檔名
filetype 指定跟副檔名關聯的檔案型別
鍵入 assoc 而不帶引數,顯示當前檔案關聯。如果只用檔案擴充套件
名呼叫 assoc,則顯示那個副檔名的當前檔案關聯。如果不為
檔案型別指定任何引數,命令會刪除副檔名的關聯。
顯示或修改用在副檔名關聯中的檔案型別
ftype [filetype[=[opencommandstring]]]
filetype 指定要檢查或改變的檔案型別
opencommandstring 指定呼叫這類檔案時要使用的開放式命令。
鍵入 ftype 而不帶引數來顯示當前有定義的開放式命令字串的
檔案型別。ftype 僅用乙個檔案型別啟用時,它顯示那個檔案類
型目前的開放式命令字串。如果不為開放式命令字串指定,
ftype 命令將刪除那個檔案型別的開放式命令字串。在乙個
開放式命令字串之內,命令字串 %0 或 %1 被通過關聯呼叫
的檔名所代替。%* 得到所有的引數,%2 得到第乙個引數,
%3 得到第二個,等等。%~n 得到其餘所有以 nth 引數打頭的
引數;n 可以是從 2 到 9 的數字。例如:
assoc .pl=perlscript
ftype perlscript=perl.exe %1 %*
允許你啟用以下 perl 指令碼:
script.pl 1 2 3
如果不想鍵入副檔名,則鍵入以下字串:
set pathext=.pl;%pathext%
被啟動的指令碼如下:
script 1 2 3
比如,我們想讓.abc
這個字尾名在windows 資源管理器裡顯示檔案型別為「某軟體的檔案」,雙擊後開啟軟體c:\program files\abc\abc.exe
,就可以執行:
assoc .abc=某軟體的檔案
ftype 某軟體的檔案="c:\program files\abc\abc.exe" "%1"
其中"%1"這一引數將會被系統替換成檔案路徑。
這一定要有管理員許可權。
但是很快我們就會注意到問題:沒法自定義圖示,而且對其他軟體的字尾名執行assoc
檢視內容,我們會發現關聯的都是一串英文,可windows資源管理器裡看到的卻是中文的型別。這需要通過系統登錄檔來實現。
writeregstr hkcr ".abc" "" "abc.file"
writeregstr hkcr "abc.file" "" "某軟體的檔案" ; 檔案型別名稱
writeregstr hkcr "abc.file\defaulticon" "" "$instdir\abc.ico" ; 圖示
writeregstr hkcr "abc.file\shell" "" ""
writeregstr hkcr "abc.file\shell\open" "" ""
writeregstr hkcr "abc.file\shell\open\command" "" '"$instdir\abc.exe" "%0"' ; 執行時指令,單引號裡的內容同前面ftype指令
注意不要漏掉最後一行外面的單引號
其中所有的abc.file可以換成你自己想用的名稱
解除安裝程式裡只要用對應的deleteregkey hkcr ".abc"
等指令就可以去除關聯了
修改完檔案型別、圖示、命令列,卻發現桌面上的圖示仍然沒變。這是因為只有windows 資源管理器被要求重新整理圖示的時候才會重新整理,所以需要重新整理桌面圖示快取。直接上**:
!include "filefunc.nsh"
$
第二行要放在function或者section裡才能使用 擷取檔案字尾名
擷取給的檔名的字尾名 在這裡要注意可能出現的檔案是否有字尾名,例如.abc和abc.其實這兩種是沒有字尾名的,所以判斷切片 的索引位置必須有所限制 def foo filename,has dot false 獲取檔名的字尾名 param filename 檔名 param has dot 字尾名是...
獲取檔案字尾名
獲取到filename的字尾 利用lastindexof 從最後面截字尾,找到最後乙個點的索引然後加一,利用substring擷取該索引後的字串 f.getfilename substring f.getfilename lastindexof 1 lastindexof 方法有以下四種形式 pub...
檔名(字尾名)修改
就自己寫了段 來實現 檔名 字尾名 修改的小函式。剛開通部落格就把 放上來了。希望大俠看到指點一二。不勝榮幸!view code 1 2 修改檔名 3 4 原始檔全名 包括路徑 5 檔案字尾名 為空表示不修改 6 檔案後 為空表示不修改 7 返回異常訊息 8static void changeext...