我在目录结构中有几个目录,子目录等,其中一些将具有各种匹配文件。例如如果目录中存在 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
循环的某种集合。
由于
答案 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()
方法语法。
(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
}