如何在 Windows 上从控制台命令打开“打开方式”GUI?

Jon*_*man 2 windows powershell

在 Windows 上,如果右键单击资源管理器中的文件,您会看到一个上下文菜单。其中一项是Open With> Choose another program。单击此按钮将打开一个 GUI,以选择打开该文件的程序。是否可以从命令行打开此 GUI?

zet*_*t42 6

有一个用于此目的的shell 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 )

Run Code Online (Sandbox Code Playgroud)

从命令行运行此脚本,如下所示:

powershell.exe c:\openas.ps1 c:\file.txt
Run Code Online (Sandbox Code Playgroud)