我正在尝试编写一些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。
答案 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]
循环中返回FullName
和ForEach
属性:
Get-ChildItem -Path "C:\Folder\" -Filter "*.xls" | Where{$_.basename -match "(test1|test2|test3)"} | ForEach{$Matches[1];$_.FullName}
其中任何一个都会为您提供所需的输出。他们都没有直接回答你如何访问父项的问题,但它们是相当可靠的方法,可以避免将其分配给变量,然后再引用该变量。