在 Windows 上,如果您在資源管理器中右鍵單擊一個檔案,您將獲得一個背景關系選單。其中一項是Open With> Choose another program。單擊它會打開一個 GUI 以選擇一個程式來打開檔案。是否可以從命令列打開此 GUI?
uj5u.com熱心網友回復:
有一個用于此目的的外殼 API,可以使用P/Invoke從 PowerShell 中使用它。這比經常建議但未記錄的“RunDll32.exe OpenAs_RunDLL”方法更可靠(有關為什么它不好的詳細資訊,請參閱此答案)。
將此代碼保存為“openas.ps1”:
param (
[Parameter(Mandatory)]
[String] $Path
)
$ErrorActionPreference = 'Stop'
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
public class ShellOpenWith {
[DllImport("shell32.dll", EntryPoint = "SHOpenWithDialog", CharSet = CharSet.Unicode)]
private static extern int SHOpenWithDialog(IntPtr hWndParent, ref tagOPENASINFO oOAI);
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773363(v=vs.85).aspx
private struct tagOPENASINFO
{
[MarshalAs(UnmanagedType.LPWStr)]
public string cszFile;
[MarshalAs(UnmanagedType.LPWStr)]
public string cszClass;
[MarshalAs(UnmanagedType.I4)]
public tagOPEN_AS_INFO_FLAGS oaifInFlags;
}
[Flags]
private enum tagOPEN_AS_INFO_FLAGS
{
OAIF_ALLOW_REGISTRATION = 0x00000001, // Show "Always" checkbox
OAIF_REGISTER_EXT = 0x00000002, // Perform registration when user hits OK
OAIF_EXEC = 0x00000004, // Exec file after registering
OAIF_FORCE_REGISTRATION = 0x00000008, // Force the checkbox to be registration
OAIF_HIDE_REGISTRATION = 0x00000020, // Vista : Hide the "always use this file" checkbox
OAIF_URL_PROTOCOL = 0x00000040, // Vista : cszFile is actually a URI scheme; show handlers for that scheme
OAIF_FILE_IS_URI = 0x00000080 // Win8 : The location pointed to by the pcszFile parameter is given as a URI
}
public static void DoOpenFileWith(string sFilename, IntPtr hwndParent = new IntPtr())
{
tagOPENASINFO oOAI = new tagOPENASINFO();
oOAI.cszFile = sFilename;
oOAI.cszClass = String.Empty;
oOAI.oaifInFlags = tagOPEN_AS_INFO_FLAGS.OAIF_ALLOW_REGISTRATION | tagOPEN_AS_INFO_FLAGS.OAIF_EXEC;
SHOpenWithDialog(hwndParent, ref oOAI);
}
}
'@
[ShellOpenWith]::DoOpenFileWith( $path )
從命令列運行此腳本,如下所示:
powershell.exe c:\openas.ps1 c:\file.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/401238.html
上一篇:使用navArgs將Fragment轉換為DialogFragment,如何從Fragment類外部導航到DialogFragment
