使用Get-Content从文本文件中获取过滤内容

时间:2016-11-15 09:48:26

标签: powershell

我有点卡在这里。基本上我有一个脚本从文本文件中读取目录和文件路径。

我想通过 driveletter 排除路径来过滤它们,例如program filesC:\Windows目录。每个driveletter都有一个变量但是当我使用下面的代码时,它似乎没有过滤任何东西。如果包含中包含C EG似乎无关紧要。它总是将SaveMe.txt文件的整个内容放在每个变量中。

有什么建议吗?

$CDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("C:\")) -and $_ -NotContains "Program Files" -or "C:\Program Files (x86)" -or "C:\Windows" }
$EDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("E:\")) -and $_ -NotContains "Program Files" -or "C:\Program Files (x86)" -or "C:\Windows" }
$GDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("G:\")) -and $_ -notcontains "Program Files" -or "C:\Program Files (x86)" -or "C:\Windows" }

4 个答案:

答案 0 :(得分:1)

试试这个

解决方案1:

$CDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and $_.Contains("C:\") -and !$_.Contains("Program Files") -and !$_.Contains("C:\Windows") }
$EDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and $_.Contains("E:\") -and !$_.Contains("Program Files") -and !$_.Contains("C:\Windows") }
$GDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and $_.Contains("G:\") -and !$_.Contains("Program Files") -and !$_.Contains("C:\Windows") }

解决方案2:

$CDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("C:\")) -and $_ -Notlike "*Program Files*" -and $_ -Notlike "*C:\Windows*" }
$EDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("E:\")) -and $_ -Notlike "*Program Files*" -and $_ -Notlike "*C:\Windows*" }
$GDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and ($_.Contains("G:\")) -and $_ -Notlike "*Program Files*" -and $_ -Notlike "*C:\Windows*" }

答案 1 :(得分:0)

你需要使用-like和-notlike。包含用于检查数组中是否存在某些内容,而不是字符串

答案 2 :(得分:0)

如上所述,您应该使用内置比较函数Translator-like。此外,您无法在不指定比较功能的情况下组合-notlike语句。

但是,我认为会使这更具可读性:

-or

答案 3 :(得分:0)

优化解决方案(文件只打开1x)

$CDrive=@()
$EDrive=@()
$GDrive=@()

Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and $_ -notlike "*Program Files*" -and $_ -notlike "*C:\Windows*" } | %{ if ($_.Contains("C:\")) {$CDrive+=$_};if ($_.Contains("E:\")) {$EDrive+=$_};if ($_.Contains("G:\")) {$GDrive+=$_};}