考虑一个 .m3u(视频播放列表)文件。我们可以在几个完全不同的应用程序中打开它,例如...
C:\Program Files\VLC\VLC.exe --> Read the file and play a series of video it specifies
C:\Windows\system32\notepad.exe --> Edit the contents of the file, specifying a new list of videos
我知道(在 Windows 中)我可以按如下方式在任一应用程序中打开该文件(我将其称为......)
“命令文件”语法
C:\> "C:\Program Files\VLC\VLC.exe" Playlist.m3u --> opens Playlist.m3u in VLC
C:\> "C:\Windows\system32\notepad.exe" Playlist.m3u --> opens Playlist.m3u in notepad
“文件命令”语法(?)
我想知道是否可以逆转这种情况(先调用文件,然后调用应用程序),例如......
C:\> Playlist.m3u "C:\Windows\system32\notepad.exe" --> ❌ Opens Playlist.m3u in the default app (ignores everything after the filename)
C:\> Playlist.m3u | "C:\Windows\system32\notepad.exe" --> ❌ Opens Playlist.m3u in the default app AND open notepad.exe (but not to edit Playlist.m3u, just opens app)
这种语法(或类似的语法)可行吗?
提前致谢!
答案1
在 PowerShell 中,您可以像这样实现语法:
"C:\Playlist.m3u" | %{notepad.exe $_}
"C:\Playlist.m3u" | %{&"C:\Program Files\VideoLAN\VLC\VLC.exe" $_}
它将路径传送到可执行文件的调用并将其添加为参数。
答案2
因此,Windows 根据您的版本应用了一个称为“文件类型关联”或“默认程序”或“默认应用程序”的概念,但它们都做同样的事情。它们将文件扩展名(例如m3u
)与应用程序和一组可选的参数相关联。
文件类型关联的目的是让您能够简单地打开内容文件,而无需告诉 shell 您要使用哪个应用程序来处理它。Windows 将简单地打开关联/默认应用程序并加载该文件。
因此,如果您想控制使用该文件的应用程序,您必须启动该应用程序并加载该文件(通过 cli 将其作为参数传递,或Open With
从资源管理器上下文菜单中使用),或者您可以简单地打开该文件,并让文件类型关联确定要启动哪个应用程序。
您的方法的根本缺陷在于,命令 shell 无法真正将不可执行文件识别为“命令”。可以调用可执行文件,但不能调用内容文件,除非使用某种可执行文件。因此,windows 只能以它能做到的方式对您的第二组命令做出反应;通过调用与该文件类型关联的可执行文件,并将内容文件作为参数传递给该可执行文件。
所有这些实际上都归结为执行逻辑的能力。应用程序/命令可以做出决策。内容文件不能。您作为第一个令牌发送到命令 shell 的任何内容都必须是命令/可执行文件,因为某物必须处理您输入的其余语句。如果您尝试调用不可执行文件,Windows 会尝试通过打开默认应用程序来帮助您,因为这是它所能做的全部。
答案3
Windows 中有两种类型的程序。控制台和图形。通常,它们的编程方式截然不同。
与 Windows 启动程序角度的不同之处在于控制台程序会自动获取控制台。就是这样。
实际上,如果不进行更多设置,就无法使用控制台。
由于图形程序没有控制台,尽管它们可以请求一个控制台或附加到现有的控制台,但它们不支持控制台的 StdIn 或 StdOut。