2011-12-30 14 views
0

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

到目前为止,我有:

如果
$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运行它,我会得到正确的输出。

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

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

+0

我不清楚你的意思是“一次只传一行”。您每次调用4个参数来调用该程序三次。你能更具体地说明你想要做什么吗? – 2011-12-30 23:43:42

+0

访问'$ file [0] .FullName'时会得到什么? – 2011-12-31 00:40:40

+0

'$ file [0] .fullname'和'$ file [0]'是一样的:'C:\ file.txt' – Philosophene 2011-12-31 00:46:50

回答

0

尝试

$($file[0]) 

我发现我经常来包装“神奇”美元符号括号的东西,让他们在PowerShell中的工作。

+0

这里没什么神奇的。你在这里得到的是[subexpression](http://ss64.com/ps/syntax-operators.html),在这种情况下它只返回相同的'System.IO.FileInfo'对象。 – 2011-12-31 00:38:07

+0

稍作修正,实际上它返回一个'PSCustomObject'。当我第一次阅读arcesso的代码时,我忽略了第一行的结尾。然而,子表达式的结果是相同的,它返回相同的对象。 – 2011-12-31 01:16:50

+1

是的,我引用了“神奇”的原因。这并不是说它们实际上是魔术,而是暗示它们是解决这类问题的好方法,这种方法似乎会出现很多问题。 – 2011-12-31 03:40:31

0

由于您管道到Select-Object并选择FullName属性您有3个对象System.Management.Automation.PSCustomObjectFullName属性。你应该将它作为命令行参数为您这样的程序时,在对象上访问FullName属性:

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

如果从Select-Object小命令删除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 
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个对象,也可以工作。

相关问题