问题描述
我有一个文件夹,里面有一堆 .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
)。