【问题标题】:PowerShell: Finding if a word in a text file is part of an array of stringsPowerShell:查找文本文件中的单词是否是字符串数组的一部分
【发布时间】:2021-02-20 23:29:46
【问题描述】:

我有一个包含一堆 .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
}
}

【问题讨论】:

  • Move-Item $content 更改为 Move-Item $_.Fullname。您将文件的内容传递给 move cmdlet
  • 如果一个文件包含多个匹配项怎么办?第一个匹配的词得到文件,这是你需要担心的吗?
  • 该文件只包含一个匹配项(即“OVERTIME”),它可能出现多次,但它始终只是数组中列出的字符串之一。

标签: powershell nested-loops string-matching


【解决方案1】:
$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 开关仅在每个输入文件中查找 first 匹配项。

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

【讨论】:

  • 一切都很好。谢谢你。最后一个问题,如果目标文件夹不存在怎么办? move-item 也会创建一个文件夹吗?
  • 很高兴听到它有帮助,@PythonLearner。不,Move-Item 不会按需创建目标文件夹;最好事先使用$null = New-Item -Force -Type Directory 'C:\Users\My_User\Desktop'
猜你喜欢
  • 2019-12-29
  • 2020-03-22
  • 2018-01-24
  • 2016-09-05
  • 2022-01-09
  • 2018-04-01
  • 2022-06-17
  • 2019-07-19
  • 2020-03-10
相关资源
最近更新 更多