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 %*
你的 ASSOC
和 FTYPE
语句似乎没问题。
根据 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" %*
我创建了一个自定义文件扩展名,我将关联到一个批处理脚本。 我用了
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 %*
你的 ASSOC
和 FTYPE
语句似乎没问题。
根据 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" %*