在 WSL2 中,我经常喜欢一次打开一组文件(通常是 PDF)。
使用这个 bash 脚本,直到最近它一直有效:
#!/usr/bin/env bash
# Copyright (C) 2014, Alexey Pavlov
# mailto:[email protected]
# This file is part of Minimal SYStem version 2.
# https://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
# File: start
COMSPEC="/mnt/c/Windows/System32/cmd.exe"
declare -a ARG
for arg in "${@}" ; do
arg=$(wslpath -wa "${arg}")
ARG=("${ARG[@]}" "${arg//&/^&}")
done
echo "${ARG[@]}"
"$COMSPEC" /c start '' "${ARG[@]}"
(我将其保存为~/bin/oo
,因为我喜欢快速的两字母命令。)
用法:
$ oo *.pdf
c:\full\path\A1.pdf c:\full\path\A2.pdf c:\full\path\B1.pdf c:\full\path\B2.pdf
(回显的文件名主要用于调试,除此之外,脚本不需要在屏幕上回显任何内容。)
直到最近,这将使用我的系统 PDF 阅读器(sumatra pdf,但这似乎并不重要)并打开全部的文件。但是,在最近的“更新”之后,它只能打开第一个文件。
这对 PNG 集合也具有相同的作用,它并不是文件类型或 pdf 阅读器应用程序所独有的。
我现在的解决方法是
$ oo .
它将在当前目录中打开一个 Windows 资源管理器,然后选择所有相关文件并点击Enter
,然后启动我的 pdf 阅读器并打开所有文件。
这种变化是我能控制的吗?(有没有更好的方法?)
答案1
start
真的只是推出一一次只处理一个文件,其余文件将作为启动该文件的命令行参数包含在内。因此,如果您尝试start
一次处理多个文件,它们都将传递给同一个程序——即第一的文件与之关联。
当从注册表中查找默认的 shell 动词时,%1
命令中的 a 将扩展为文件名,而%2
、%3
&c. 是附加参数。例如,.mdb
(Access.MDBFile) 在 下有以下内容shell\open\command
:
> reg query HKCR\.mdb
Access.MDBFile
> reg query HKCR\Access.MDBFile\shell\open\command
"C:\Program Files\[..]\Office16\MSACCESS.EXE" /NOSTARTUP "%1" %2 %3 %4 %5 %6 %7 %8 %9
这意味着启动foo.mdb /wrkgrp shared.mdw
(好像 foo.mdb 是一个程序)将导致额外的参数/wrkgrp
shared.mdw
通过 传递给 MSACCESS.EXE %2
%3
。
当您尝试以start
这种方式打开多个文件时,程序将一次收到它们的名称(尽管其余文件可能未加引号,并且您会遇到文件名中的空格问题 - 并且由于是可选的,因此无法加引号)并且希望一次打开所有文件。
另一方面,PuTTY .ppk
(PPK_Assoc_ProgId)的open
动词定义为:
> assoc .ppk
.ppk=PPK_Assoc_ProgId
> ftype PPK_Assoc_ProgId
"C:\Program Files\PuTTY\pageant.exe" "%1"
在这种情况下,由于命令仅包含"%1"
,因此任何附加选项将不会传递给 pageant.exe – 仅有文件名。
为确保万无一失,我在 Windows XP SP3 上测试了这一点,并运行了进程监视器,以查看传递给新进程的命令行。如果我运行start a.txt b.txt c.txt
(使用 Windows 标准的 .txt 关联,Notepad 仅具有%1
),则只有一这些文件列在 Notepad.exe 进程的命令行中。
所以真的做取决于特定程序及其设置文件关联的方式 - 并且,在它碰巧工作的情况下,它更多的是偶然工作,而不是有意为之。请改用循环for
。