【发布时间】:2019-12-09 14:59:04
【问题描述】:
我是 PowerShell 新手。我花了将近两天的时间尝试寻找一些文件夹。不管我做什么都行不通。我在文件系统中有以下结构。
My-GitRepo
|-Src
|-MyCSharpProject_A
|-bin
|-MyCSharpProject_A.csproj
|-MyCSharpProject_B
|-bin
|-MyCSharpProject_B.csproj
|-MyCSharpProject_C
|-bin
|-MyCSharpProject_C.csproj
|-Tools
|-MyPowerShellScript.ps1
我目前正在处理这个“MyPowerShellScript.ps1”文件。我想做的是从“Src”文件夹中获取 *.csproj 文件,它可以工作Get-ChildItem -Path "..\Src\*\*.csproj"。但目标有点复杂。我尝试将 Get-ChildItem 与管道一起使用:
- 按上述方式获取 *.csproj 文件
- 获取包含它们的文件夹
- 将文件夹路径与“bin”子文件夹名称结合起来
- 测试“bin”文件夹是否存在
- 并将现有的“bin”文件夹路径放入本地数组变量中。
因此,我需要动态创建一个我目前在脚本中硬编码的数组。
$folders = (
"..\Src\MyCSharpProject_A\bin",
"..\Src\MyCSharpProject_B\bin",
"..\Src\MyCSharpProject_C\bin",
);
Get-ChildItem -Path "..\Src\*\bin" 不是我想要的。我正在尝试查找存在于 csproj 文件旁边的“bin”文件夹。
如果我可以用 C# 编写相同的代码,它将是以下之一:
string[] qryA = new DirectoryInfo(Environment.CurrentDirectory)
.Parent
.GetDirectories(@"Src")
.Single()
.GetDirectories()
.SelectMany(d => d.GetFiles(@"*.csproj"))
.Select(f => f.Directory.FullName)
.Select(d => Path.Combine(d, "obj"))
.Where(d => Directory.Exists(d))
.ToArray();
string[] qryB = new DirectoryInfo(Environment.CurrentDirectory)
.Parent
.GetDirectories(@"Src")
.Single()
.GetDirectories()
.SelectMany(d => d.GetFiles(@"*.csproj"))
.Select(f => f.Directory.GetDirectories("obj").SingleOrDefault())
.Where(d => d?.Exists == true)
.Select(d => d.FullName)
.ToArray();
什么是重要的:
- 能够使用“工具”文件夹中的相对路径,该文件夹是执行脚本的当前目录
- 在脚本执行期间不要改变当前目录,
- 拥有单一管道(更多功能样式),我可以稍后将其转换为函数并在多个脚本之间共享。
更新:现在我有了一些可以工作的东西,但它仍然没有管道的形式:
$csProjs = Get-ChildItem -Path "..\Src\*\*.csproj" -File;
$folders = @();
foreach ($csProj in $csProjs)
{
$prjFolder = Split-Path $csProj;
$objPath = Join-Path $prjFolder "obj";
if (Test-Path $objPath -PathType Container)
{
$folders += $objPath;
}
}
可以转成管道吗?
请帮忙!!!
【问题讨论】:
标签: powershell pipeline get-childitem