Windows: 建立批处理文件的文件关联

Windows: establish file association to batch file

我创建了一个自定义文件扩展名,我将关联到一个批处理脚本。 我用了

ASSOC .myext=MY.FILETYPE
FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" %1 %*

现在批处理文件"C:\Path\of\my\batch.bat"是一个简单的单行文件

echo %1

大致有效:双击 .myext 文件会弹出一个 cmd shell 回显文件路径。
但是当 .myext 文件位于包含 spaces 的路径中时会出现问题:回显文件路径被截断为 space.
在 FTYPE 语句中双引号 %1 似乎不起作用。

FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" "%1" %*

如果您从 bat 文件中使用它,请尝试将其更改为:

ASSOC .myext=MY.FILETYPE
FTYPE MY.FILETYPE=cmd /c "C:\Path\of\my\batch.bat" "%%1" %%*

我觉得甚至

  FTYPE MY.FILETYPE="C:\Path\of\my\batch.bat" "%%1" %%*

应该可以。

将批处理文件"C:\Path\of\my\batch.bat"内容更改为

echo %*

你的 ASSOCFTYPE 语句似乎没问题。

根据 Monacraft 的评论编辑

此解决方案是正确的,因为 %1 将引用文档 filename%* 将引用更多参数:If any应用程序需要更多参数,它们可以作为 %2%3 传递。 要将 所有 参数传递给应用程序,请使用 %*

直接从命令行使用 aFile.myext a b c 很方便,尽管为此使用 FTYPE 语句应该是

FTYPE MY.FILETYPE=cmd /D /C "C:\Path\of\my\batch.bat "%1"" %*

区分第一个参数是否包含空格。

示例:与

ASSOC .xxx=XXXFILE
rem a bug here FTYPE XXXFILE=%ComSpec% /D /C "d:\bat\xxxbatch.bat "%1"" %*
rem definitely switched to Jeb's solution as follows
FTYPE XXXFILE=%comspec% /D /C call "d:\bat\xxxbatch.bat" "%1" %*

xxxbatch.bat如下

@echo(
@echo %*
@if "%2"=="" pause
@goto :eof

输出:

d:\bat>D:\test\xxxFileNoSpaces.xxx aa bb cc

"D:\test\xxxFileNoSpaces.xxx"  aa bb cc

d:\bat>"D:\test\xxx file with spaces.xxx" dd ee

"D:\test\xxx file with spaces.xxx"  dd ee

d:\bat>

双引号 %1 是正确的,但它失败了,因为 cmd.exe 当命令和至少一个参数包含引号时包含错误。
因此,您需要通过插入 CALL.

使命令不带引号
FTYPE MY.FILETYPE=cmd /c call "C:\Path\of\my\batch.bat" "%1" %*