Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 使用“获取内容”从文本文件中获取筛选的内容_Powershell_Regex - Fatal编程技术网

Powershell 使用“获取内容”从文本文件中获取筛选的内容

Powershell 使用“获取内容”从文本文件中获取筛选的内容,powershell,regex,Powershell,Regex,我有点困在这里了。基本上我有一个从文本文件读取目录和文件路径的脚本 我想按驱动器号筛选它们,并排除路径,如程序文件和C:\Windows目录。每个driveletter都有一个变量,但当我使用下面的代码时,它似乎没有过滤任何东西。容器中是否包含CE或G,这似乎并不重要。它将始终在每个变量中放入SaveMe.txt文件的全部内容 有什么建议吗 $CDrive = Get-Content $PSScriptRoot\SaveMe.txt | where { $_.length -gt 4 -and

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

我想按驱动器号筛选它们,并排除路径,如
程序文件
C:\Windows
目录。每个driveletter都有一个变量,但当我使用下面的代码时,它似乎没有过滤任何东西。容器中是否包含
C
E
G
,这似乎并不重要。它将始终在每个变量中放入
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" }

你需要使用-like和-notlike。Contains用于检查数组中是否有内容,而不是字符串

解决方案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*" }

如前所述,您应该使用内置的比较功能
-like
-notlike
。此外,如果不再次指定比较函数,则无法组合
-或
语句

然而,我认为这将使其更具可读性:

$CDrive = Get-Content $PSScriptRoot\SaveMe.txt |  where { $_ -match 'C:\\(?!Windows\\|Program Files\\|Program Files \(x86\)\\).+'}
$EDrive = Get-Content $PSScriptRoot\SaveMe.txt |  where { $_ -match 'E:\\(?!Windows\\|Program Files\\|Program Files \(x86\)\\).+'}
$GDrive = Get-Content $PSScriptRoot\SaveMe.txt |  where { $_ -match 'G:\\(?!Windows\\|Program Files\\|Program Files \(x86\)\\).+'}
优化的解决方案(仅打开1x文件)


你的
$PSScriptRoot\SaveMe.txt看起来怎么样?包含像C:\Users\$env:username\Documents C:\Users\$env:username\Pictures C:\Users\$env:username\Desktop C:\Users\$env:username\Favorites C:\Users\$env:username\Music C:\Users\$env:username\videos这样的完整路径,但它会检查传送到$\,这不是一种数组吗?如果我错了,请纠正我!:)不,这是一个对象,您正在“处理”该对象属性的字符串表示形式。谢谢您的澄清!仍在学习powershell的诀窍。不客气,但请选择一些答案,并投票选出有用的答案,谢谢!缺少C:\Program文件(x86)。此外,包含
程序文件的文件夹也将被排除在外。否。如果不包含“程序文件”,则不包含“C:\Program Files(x86)”,因此,文件夹“C:\myApp\native Program Files”将被排除,这可能不是他想要的。他写道:-不包含“程序文件”且不-不在“程序文件”及其代码中,我想他想要排除“程序文件”。所以这是多余的。现在给了他一个方法,但不是这样的。
$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+=$_};}