如何将get-childitem的结果传递给命令?

时间:2016-11-03 03:22:42

标签: powershell

我在目录结构中有几个目录,子目录等,其中一些将具有各种匹配文件。例如如果目录中存在 X.config.default ,它也会有相应的 X.config.build

c:\Stuff\dir1
web.config.default
web.config.build

c:\Stuff\dir2
app.config.default
app.config.build

c:\Stuff\dir2\sub2
foo.config.default
foo.config.build
bar.config.default
bar.config.build
这将显示与* .config.default及其相应目录匹配的所有文件名
get-childitem -Recurse *.* -Filter *.config.default | Select Name, Directory

但是我没有显示文件及其路径,而是想为每个“匹配”做点什么。在这种情况下,我想调用一个名为 ctt 的程序并向其发送三个参数。 ctt的调用如下:

ctt s:<source file> t:<transform file> d:<destination file>

假设第一个匹配在目录fubar中被称为c:\Stuff\dir1,执行的ctt命令应如下所示:

ctt s:c:\Stuff\dir1\fubar.config.default t:c:\Stuff\dir1\fubar.config.build d:c:\Stuff\dir1\fubar.config pw

我猜有几种方法可以做到这一点。管道get-childitem会产生一个命令,或者将它们发送到我可以进行foreach循环的某种集合。

由于

1 个答案:

答案 0 :(得分:1)

有几种不同的方法可以解决这个问题。如果您使用的是旧版PowerShell,则很可能只使用ForEach-Object cmdlet。

Get-ChildItem -Path c:\Stuff\* -Recurse -Filter *.config.default | 
  ForEach-Object -Process {
    $BuildName = $PSItem.Name.Split('.')[0] ### Get just the "fubar" part.
    ctt s:"$($PSItem.FullName)" t:"$($PSItem.Directory.FullName)\$BuildName.config.build" d:"$($PSItem.Directory.FullName).config" pw
  }

在较新版本的PowerShell上,从4.0开始,您可以使用ForEach()方法语法。

http://social.technet.microsoft.com/wiki/contents/articles/26489.powershell-4-0-where-and-foreach-method-syntax.aspx

(Get-ChildItem -Path c:\Stuff\* -Recurse -Filter *.config.default).ForEach({ 
  $BuildName = $PSItem.Name.Split('.')[0] ### Get just the "fubar" part.
  ctt s:"$($PSItem.FullName)" t:"$($PSItem.Directory.FullName)\$BuildName.config.build" d:"$($PSItem.Directory.FullName).config" pw
}