【问题标题】:Passing agruments to another program in Powershell将参数传递给 Powershell 中的另一个程序
【发布时间】:2011-12-30 23:24:20
【问题描述】:

我正在尝试编写一个脚本来解析一个目录,在具有相同名称但扩展名不同的其他文件中找到给定扩展名的 3 个最新文件,然后将输出传递给命令行程序。

到目前为止我有:

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0] argumentB "argumentC"
\path\program argumentA $file[1] argumentB "argumentC"
\path\program argumentA $file[2] argumentB "argumentC"

不确定它是否很重要,但 argument2 需要用引号括起来才能让程序使用它。我最终会将输出写入文件,或者最好在附加问题中描述的另一行代码中使用输出。

我遇到的问题是,当我使用 $file[0] 作为参数时,什么也没有发生。当我使用存储在 $file[0] 中的文件名而不是使用变量时,它会运行,但不会传递参数 B 或参数 C。如果我从 cmd 运行它,我会得到正确的输出。

我的问题是: 如何让程序识别变量? 如何让程序识别其他参数?

奖金问题: 该程序将输出文件列表。如何删除给定文件夹中除程序输出中列出的文件之外的所有内容?

【问题讨论】:

  • 我不清楚您的意思是“一次只通过一条线”。您调用该程序三次,每次调用 4 个参数。你能更具体地说明你想要它做什么吗?
  • 访问$file[0].FullName会得到什么?
  • $file[0].fullname$file[0] 相同:C:\file.txt
  • 谢谢。再看一遍,我明白你的意思了。它确实返回了输出,但没有传递参数 C。参数 B 传递正常。
  • 有效的方法是将最后一个参数放在单引号中。感谢您的帮助。

标签: powershell parameter-passing


【解决方案1】:

试试

$($file[0])

我发现我经常不得不将东西包裹在“神奇的”美元符号括号中才能让它们在 PowerShell 中工作。

【讨论】:

  • 这里没有什么神奇的。您在这里拥有的是 subexpression 在这种情况下它只返回相同的 System.IO.FileInfo 对象。
  • 稍作修正,它实际上返回一个PSCustomObject。当我第一次阅读 arcesso 的代码时,我忽略了第一行的结尾。但是子表达式的结果是一样的,它返回的是同一个对象。
  • 是的,我引用“神奇”是有原因的。这并不是说它们是——事实上——魔法,而是表明它们是解决此类问题的好方法,这些问题似乎经常出现。
【解决方案2】:

由于您正在管道到Select-Object 并选择FullName 属性,因此您有3 个System.Management.Automation.PSCustomObject 类型的对象和FullName 属性。在将对象用作程序的命令行参数时,您应该访问对象的 FullName 属性,如下所示:

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0].FullName argumentB "argumentC"

如果您从 Select-Object cmdlet 中删除 fullname 属性,Powershell 将不会创建 PSCustomObject,您可以访问原始 System.IO.FileInfo 对象中的所有属性和方法。

这就是你可以看出区别的方式:

PsCustomObject

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
$file[0] | gm

System.IO.FileInfo

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select -last 3
$file[0] | gm

【讨论】:

    【解决方案3】:

    我实际上会使用循环来避免重复。 (这样您就可以避免复制和粘贴错误并简化问题,尤其是在您稍后添加错误处理或其他任何内容时)。

    $files = dir test -Exclude *.md5 | sort -prop LastWriteTime | 
      select fullname -last 3
    
    foreach ($file in $files) { 
      & \path\program argumentA $file argumentB "argumentC"
    }
    

    由于 PS 将集合视为与普通对象一样,因此即使您只选择 1 个对象,这也有效。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 2015-06-27
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 2016-09-24
      • 2012-09-25
      • 2020-10-03
      相关资源
      最近更新 更多