我正在构建一个文件列表,我将这些文件放入我的 $list 变量中。
然后我想根据 $filter 变量过滤列表。当前的解决方案有效,但不适用于正则表达式。
$filter = @("test.txt","Fake","AnotherFile\d{1..6}")
######### HTML TESTS #############
[string]$list = @"
FakeFile.txt
test120119.txt
AnotherFile120119.txt
LastFile.txt
"@
[array]$files = $list -split '\r?\n'
$files = $files | Where-Object {$_} | Where {$_ -notin $filter} # filter out empty items from the array...
$files
Run Code Online (Sandbox Code Playgroud)
我的想法是将正则表达式模式放在 $filter 变量中,这样我就可以捕获包含日期戳的文件名,例如test120119.txt上面的 $list 变量。
如何更改我的代码以允许使用正则表达式?我在不拆分 $list 的情况下尝试了 select-string 的一些变体,但效果不佳。我也尝试将我的更改-notin为 -notmatch 但这当然根本不起作用。
我有这个测试数据:
^Test data
This is all just test data
testing 123
ABC>space "ABC"
ABC>
Run Code Online (Sandbox Code Playgroud)
我已经在 regex101.com 上设置了一个正则表达式
(^\^|ERROR).*((|\n|\r|\w|\W)?)+(?=ABC>)
该表达式返回的正是我在网站上想要的内容:
我正在使用我编写的这个 powershell 来获取与上面内容类似的内容并循环遍历文件,并查找相同正则表达式的匹配项。
$files = gci "\\server\path"
$content = @()
ForEach($file in $files){
# Set script name
$scriptname = "ABC TEST_081722"
# Get the name of the task for the logfile's filename.
$taskname = "THIS IS A TEST!!!"
# Create log file with a datestamp MMDDYY
$datestamp = (get-date).ToString('MMddyy')
$logfilepath = "\\server\path\Logs\$($taskname)\$($file.basename).log"
$log_dir = "\\server\path\Logs\$($taskname)\"
# Get the content of the …Run Code Online (Sandbox Code Playgroud) 文件1
"FACILITY","FILENAME"
"16","abc.txt"
"16","def.txt"
"12","abc.txt"
"17","def.txt"
"18","abc.txt"
"19","abc.txt"
Run Code Online (Sandbox Code Playgroud)
文件2
"FACILITY","FILENAME"
"16","jkl.txt"
"16","abc.txt"
"12","abc.txt"
"17","jkl.txt"
"18","jkl.txt"
"19","jkl.txt"
Run Code Online (Sandbox Code Playgroud)
我正在寻找此输出:
"FACILITY","FILENAME"
"16","abc.txt"
"12","abc.txt"
Run Code Online (Sandbox Code Playgroud)
对于File2中的每个FILENAME,我想按设施列出文件名是否在File1中。因此,如果在File1的FACILITY 20旁边列出了文件qwerty.txt,并且将File2中的FILENAME与文件名qwerty.txt匹配在同一行,则吐出输出。
假设有一个用于不同设施的qwerty.txt文件,我不想在输出中使用。
这是我尝试过的方法,但是由于我不太了解这些命令,因此感觉好像已经放弃了这些命令。
$file1 = Import-Csv $scriptPath'\loadedfiles.txt' -Delimiter ','
$file2 = Import-Csv $scriptPath'\filenames.txt' -Delimiter ','
$Header = $file1 | Get-Member | Where-Object -FilterScript {$_.MemberType -eq 'FACILITY'} | Select-Object -ExpandProperty FILENAME
Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -Property 'FILENAME' -PassThru | Select-Object -Property $Header |
Export-Csv -Path $scriptPath\test.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)
我已经看到了很多例子,该如何比较两个列表,但是我需要比较一个基于另一个属性的属性,这就是为什么我一直在努力地仅通过Google搜索答案。