语法指定一个文件,然后应用程序来处理它

语法指定一个文件,然后应用程序来处理它

考虑一个 .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。

相关内容