将参数传递给Powershell中的另一个程序

时间:2011-12-30 23:24:20

标签: powershell parameter-passing

我正在尝试编写一个解析目录的脚本,在具有相同名称但扩展名不同的其他文件中找到给定扩展名的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"

不确定它是否重要但是参数2需要引用程序才能使用它。我最终会将输出写入文件,或者最好使用红利问题中描述的另一行代码中的输出。

我遇到的问题是,当我使用$ file [0]作为参数时,没有任何反应。当我使用存储在$ file [0]中的文件名而不是使用该变量时,它会运行,但不会传递argumentB或argumentC。如果我从cmd运行它,我会得到正确的输出。

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

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

3 个答案:

答案 0 :(得分:0)

尝试

$($file[0])

我发现我经常需要在“魔法”美元符号括号中包装它们以使它们在PowerShell中工作。

答案 1 :(得分:0)

由于您要选择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

答案 2 :(得分:0)

我实际上会使用一个循环来避免重复。 (这样你就可以避免复制和粘贴错误并简化问题,特别是如果你稍后添加错误处理或其他任何事情)。

$files = dir test -Exclude *.md5 | sort -prop LastWriteTime | 
  select fullname -last 3

foreach ($file in $files) { 
  & \path\program argumentA $file argumentB "argumentC"
}

由于PS无论如何都会将集合视为与普通对象相同,即使您只选择了1个对象,这也是有效的。