引用管道元素的父级

时间:2015-04-09 18:33:53

标签: powershell

我正在尝试编写一些PowerShell来浏览文件夹并根据文件名执行不同的操作。我遇到的问题是当我使用Switch Case时_ $只包含Base Name(见下文)。有没有办法访问它的父元素?我需要获取文件的完整路径。我看到某处你可以$ _。Parent.FullPath,但这似乎不正确。

 Get-ChildItem -Path "C:\Folder\" -Filter "*.xls" | ForEach-Object {
    switch -Wildcard ($_.BaseName){
       "*test1*" {
            Write-Host "Test1"
            Write-Host $_.Parent.FullName
       }
       "*test2*" {
            Write-Host "Test2"
            Write-Host $_.Parent.FullName
       }
       "*tets3*" {
            Write-Host "Test3"
            Write-Host $_.Parent.FullName
       }
    }
}

我知道如果我从Swtich Case更改为IF语句,我将可以访问FullName。

2 个答案:

答案 0 :(得分:1)

当您在Switch语句中时,您基本上处于新管道中,因此您将丢失对父对象的引用。

除非您将该对象存储在其他地方。例如,在Switch语句之前,我添加了$file = $_来存储对$ file中当前对象的引用。当我现在运行时,这就是我所看到的:

$file = $_ 
    switch -Wildcard ($_.BaseName){
       "*test1*" {
            Write-Host "Test1"
            Write-Host $file.FullName}
[...]

>Test1
C:\temp\Test1.txt
Test12
C:\temp\Test12.txt
Test100
C:\temp\Test100.txt

现在,您可以使用$ file并选择其任何属性来再次引用当前对象。我希望这会让你朝着正确的方向前进。

答案 1 :(得分:0)

对不起,我直到现在才看到这个问题。你有一个接受的答案,我很高兴你能够解决它,但我想添加另一个选项...

您可以作为一个整体打开对象,只需对scriptblocks进行验证,这样您就可以访问整个fileinfo对象,而不仅仅是basename属性:

Switch((Get-ChildItem -Path "C:\Folder\" -Filter "*.xls")){
    {$_.BaseName -like "*Test1*"} {"Test1";$_.FullName}
    {$_.BaseName -like "*Test2*"} {"Test2";$_.FullName}
    {$_.BaseName -like "*Test3*"} {"Test3";$_.FullName}
}

或者,您可以在Where语句中运行RegEx匹配并捕获您要查找的内容,然后在$Matches[1]循环中返回FullNameForEach属性:

Get-ChildItem -Path "C:\Folder\" -Filter "*.xls" | Where{$_.basename -match "(test1|test2|test3)"} | ForEach{$Matches[1];$_.FullName}

其中任何一个都会为您提供所需的输出。他们都没有直接回答你如何访问父项的问题,但它们是相当可靠的方法,可以避免将其分配给变量,然后再引用该变量。