【问题标题】:Invoking powershell command from Windows Explorer 'Send To' menu从 Windows 资源管理器“发送到”菜单调用 powershell 命令
【发布时间】:2013-04-11 17:30:09
【问题描述】:

我创建了一个 powershell 脚本,它将所选文件复制到预定位置。
我创建了一个批处理文件来从 Windows 资源管理器的“发送到”菜单调用 Powershell 脚本。
批处理文件将选定的文件名作为参数发送到脚本。文件名可以包含空格。 批处理文件代码为

powershell "C:\copycommand.ps1 '%1'"

选择多个文件时,我想将所有文件名作为数组发送到PowerShell脚本。
我已经编写了 powershell 脚本来接受数组,但我无法从批处理文件中将文件名作为数组发送。

以下批处理脚本将所有文件名发送到批处理文件,但当文件名包含空格时失败。

Powershell "C:\copycommand.ps1" %*

有没有办法可以将所有文件名发送到 powershell 脚本。

【问题讨论】:

  • 你能举一个write-host $args的例子,也许是write-host $argument1write-host $argument2,来展示powershell脚本如何接收%*?我感兴趣的是每个元素是否用引号括起来。
  • write-host $args 返回数组中的文件名。但是,如果文件名包含空格,则文件名将拆分为两个不同的数组项。例如。 C:\ProgramFiles\Sample.txt.
  • 这适用吗? stackoverflow.com/questions/5185030/… ... 一次将多个文件放入一个批处理文件中
  • @MrFuzzyButton - 如果我使用上面链接中的答案,它仍然会为每个文件调用一次 powershell 脚本。我想一次性发送所有文件名。
  • 该链接中有一些内容,在其中一个答案中,关于使用 !cmdcmdline! 变量一次性处理整个命令行字符串,包括所有单独的文件名。另请参阅stackoverflow.com/questions/8547676/… 的答案 - 看起来很有用,@ 987654333@ (尽管我自己没有玩过它)。只是作为试验的东西提供。一切顺利。

标签: powershell batch-file


【解决方案1】:

我的bat文件长这样(最后一行是调试用的,可以去掉):

@echo off
for %%x in (%*) do ( 
    powershell.exe  -Command "C:\copycommand.ps1 '%%x'"
)

powershell.exe  -noexit

我的 powershell 脚本是:

$args | %{ Write-host "do copy $_"}

示例输出为:

do copy C:\Users\Public\Desktop\SRWare Iron.lnk
do copy C:\Users\Public\Desktop\Mozilla Firefox.lnk
do copy C:\Users\Piotrek\Desktop\Windows 7 USB DVD Download Tool.lnk

更新版本

将bat文件改成:

@echo off
set myvar=
for %%x in (%*) do call :concat %%x
echo %myvar%
powershell.exe  -Command C:\copycommand.ps1 %myvar%

powershell.exe  -noexit
goto :eof

:concat
set myvar=%myvar% '%1'
goto :eof

【讨论】:

  • 谢谢,但有没有一种方法可以一次性发送所有文件名?我想收集所有的错误并在最后显示出来。
  • 谢谢@Garath。就是这样。
  • 是否有可能让它也支持带单引号的文件名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2011-12-24
相关资源
最近更新 更多