cmd 使用多个参数启动

cmd 使用多个参数启动

在 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

相关内容