微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PowerShell:查找文本文件中的单词是否是字符串数组的一部分

如何解决PowerShell:查找文本文件中的单词是否是字符串数组的一部分

我有一个文件夹,里面有一堆 .txt 文件。我想遍历它们并检查它们中是否有任何一个包含存储在字符串数组中的关键字。如果找到匹配项,我想将该文件存储在以匹配项命名的新文件夹中。例如,我正在检查“OVERTIME”一词是否在我的一个文本文件中;如果找到匹配项,我想将文件保存在名为“OVERTIME”的新文件夹中。我打算使用 move-item 将文件从当前文件夹移动到新文件夹,这样文件就会从旧文件夹中删除。下面是我的初始代码;我不确定如何设置嵌套循环以及如何检查是否匹配。

$reports_name = @('MYTIME','NOTIME','OVERTIME')
Get-ChildItem "C:\Users\My_User\Desktop\test" -Filter *.txt | 
Foreach-Object {
$content = Get-Content $_.FullName
foreach($line in $content) {
if($line -in $reports_name){
    move-item $content -Destination C:\Users\My_User\Desktop\$line
}
}

解决方法

$reports_name = 'MYTIME','NOTIME','OVERTIME'

Select-String -List $reports_name 'C:\Users\My_User\Desktop\test\*.txt' |
  Move-Item -LiteralPath { $_.Path } `
            -Destination { "C:\Users\My_User\Desktop\$($_.Pattern)" } -WhatIf

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定操作会满足您的要求,请移除 -WhatIf

  • Select-String-List 开关仅查找每个输入文件中的第一个匹配项。

    • 注意:默认情况下,Select-String 将其(隐含的)-Pattern 参数解释为正则表达式;添加 -SimpleMatch 开关以将它们视为文字;无论哪种方式,默认情况下匹配都是不区分大小写的;添加 -CaseSensitive 以区分大小写匹配。
  • Move-Item 调用使用 delay-bind script blocks 访问 Microsoft.PowerShell.Commands.MatchInfo 实例的属性,Select-String 基于每个输入文件输出(每个输入一个文件,感谢 -List)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。