PowerShell实现查询打开某个文件的默认应用程序
程序员文章站
2022-06-24 10:56:26
许多文件扩展名和一个可执行应用程序绑定。正因为这样你才可以使用invoke-item打开一个文档。
要找出一个给定后缀名的文件是由那个默认引用程序打开它,并不麻烦。我们可...
许多文件扩展名和一个可执行应用程序绑定。正因为这样你才可以使用invoke-item打开一个文档。
要找出一个给定后缀名的文件是由那个默认引用程序打开它,并不麻烦。我们可以使用windows系统中的注册表,自行编程解决。但是在扫描注册表时,要稍微留意一下32位和64位机器的问题,这不是本文重点,点到为止。
另外一种途径,稍显旁门左道,调用windows api。下面的例子会演示如何调用。采取这种途径最大的优势是借力于操作系统。而你的付出成本只是用c#代码间接调用windows api中的函数而已:
$source = @" using system; using system.text; using system.runtime.interopservices; public class win32api { [dllimport("shell32.dll", entrypoint="findexecutable")] public static extern long findexecutablea(string lpfile, string lpdirectory, stringbuilder lpresult); public static string findexecutable(string pv_strfilename) { stringbuilder objresultbuffer = new stringbuilder(1024); long lngresult = 0; lngresult = findexecutablea(pv_strfilename, string.empty, objresultbuffer); if(lngresult >= 32) { return objresultbuffer.tostring(); } return string.format("error: ({0})", lngresult); } } "@ add-type -typedefinition $source -erroraction silentlycontinue $fullname = 'c:\windows\windowsupdate.log' $executable = [win32api]::findexecutable($fullname) "$fullname will be launched by $executable"
唯一有个限制,就是findexecutable()需要检查的文件是存在的,你不能只用文件扩展名去请求。
另外@reidca反馈说该方法不能检测mmc加载项打开的文件,比如cer和pfx证书文件,程序会崩溃。
上一篇: 他手机坏了发不了微博