将文件拖放到 PowerShell 脚本 --- 附加信息和解决方案
Nathan Hartley 使用快捷方式文件在上面发布的解决方案效果很好。 (见:stackoverflow.com/a/45838761/80161)
事实证明,您可以轻松地使用 .BAT 文件,并获得相同的结果,使用其中任何一个来调用相同的底层 .ps1 脚本文件。
下面是这两种技术的总结。以下示例脚本已在 Windows 10 上使用 Windows PowerShell 5.1 (powershell.exe) 和 PowerShell 7.1 (pwsh.exe) 进行了测试。
文件和目录名称中的多个连续空格通过以下任一技术保留,这是上述其他一些解决方案的问题。 (Nathan 的解决方案在这方面效果很好。我在下面的摘要中包含了他的解决方案以及我的 .bat 文件解决方案。)
示例快捷方式文件:
在快捷方式的属性中输入如下内容作为“目标”:
powershell.exe -noexit -File "C:\Users\User\Documents\PS Scripts\your script.ps1"
假设 PowerShell 程序在您的路径中,您也可以在将上述内容输入快捷方式时简单地键入 powershell 或 pwsh。当您保存或应用快捷方式时,它会自动将名称扩展为完整的绝对文件名。此外,如果 -File 参数路径和文件名没有空格,则可以省略被调用的 .ps1 脚本名称周围的引号。
.BAT 文件示例:
@echo off
set PSScript=%~dpn0.ps1
powershell.exe -NoExit -File "%PSScript%" %*
与上述另一位作者的帖子一样,为 .BAT 文件提供与相应 PowerShell 脚本相同的基本名称。当然,如果您愿意,也可以将调用的脚本名称明确编码到 .BAT 文件中,但上述方法可以方便地将包装器和 .ps1 脚本作为一对移动。
"%PSScript%" 周围的引号很重要,但 %*(将传递给 .BAT 脚本的所有参数传递给 PowerShell 脚本)必须不括在引号中。
以下示例 .ps1 脚本可以由上述任何一个调用:
选项 1:使用“ValueFromRemainingArguments”规范在“命名”参数中收集传递的路径名(这基本上是上面 Nathan 的示例):
param (
[Parameter(ValueFromRemainingArguments=$true)]
$Paths
)
'Paths:'
$Paths # lists the dropped path names
选项 2:在 $Args 数组中提取参数:
# Simply reference the dropped path names in the $Args array.
# The following will list all the dropped path names.
# Yes, this is a one line .ps1 script!
$Args
以下演示了“选项 2”,其中添加了一些单独访问传递的路径名的简单代码:
$Args
''
'Example of accessing passed Args individually:'
write-host "=====There are a total of $($args.count) arguments:"
for ( $i = 0; $i -lt $args.count; $i++ ) {
write-host "Argument $i is $($args[$i])"
}
2021 年 6 月更新:请参阅下面的 follow-up post 了解增强的代码,这些代码也允许您包含和扩展已删除的目录。
10/2021 更新:使用 Windows 快捷方式或 .bat 文件方法通常效果很好。 但请注意以下权衡: .bat 文件非常容易为新脚本设置 - 只需复制以前的文件并将其命名为与新的 .ps1 脚本相同的基本名称.另一方面,我发现您可以在 Windows 快捷方式上放置更多文件。作为一个例子,我发现,在我的一个比较测试中,我可以在我的 .bat 文件上放置大约 90 个文件,在我的快捷方式上放置大约 380 个文件。当然,如果文件在一个目录中,并且您删除了目录名称,那么您就完全避免了这个限制。
关于上面共享的代码选项的说明:
-
Nathan 示例中显示的 [CmdletBinding()] 规范不是
必要的,并被覆盖
[ValueFromRemainingArguments=$true] 规范,这会导致所有
剩余的已删除文件名尚未被任何前面的文件拾取
要收集到命名 $Paths 参数中的参数
规格附后。
-
当通过上面示例中的默认 $Args 变量访问已删除的文件名时,不得使用 [CmdletBinding()] 规范,否则您将收到错误,因为此规范要求所有传递的参数都具有匹配的参数规范.
-
如果在 PowerShell 脚本中既没有指定“[CmdletBinding()]”也没有指定“[Parameter(ValueFromRemainingArguments=$true)]”,并且删除并传递给 PowerShell 脚本的文件多于命名参数,则文件名首先通过命名参数传递,其余的文件名作为 $Args 参数传递,以 $Args[0] 开头。
-
上述解决方案中的一个关键元素是在调用相应 .ps1 脚本的 PowerShell 命令中使用 -File 参数而不是 -Command 参数。
-
如上所述,pwsh.exe (PowerShell 7) 可用于代替快捷方式文件或批处理文件中的 powershell.exe (Windows PowerShell)。 p>