根据数组中的部分文件名移动文件

时间:2017-09-21 17:12:52

标签: powershell

我正在尝试根据文本文件中的前缀列表移动文件,以匹配动态生成的实际文件的一部分。

文本文件中的前缀示例:

103 1stCity
25 2ndCity
302 3rdCity

没有逗号,每个城市都是文本文件中的新行(不是CSV格式)。

要搜索的文件示例:

103 1stCity 20170901 12387.txt
129 OtherCity 20170905 354568.txt

这就是我所拥有的:

$file_list = Get-Content "P:\some\path\to\PrefixOfClientNames.txt"
$search_folder = "J:\FilesToSearch_SomeStayHere"
$destination_folder = "J:\SomeFilesGetMovedHere"

foreach ($file in $file_list) {
    $file_to_move = Get-ChildItem -Path $search_folder |
                    Where-Object { $_.Name -like $file }
    if ($file_to_move) {
        Move-Item $file_to_move $destination_folder -WhatIf
    }

2 个答案:

答案 0 :(得分:3)

如果所有匹配的文件都应该转到同一目标文件夹,那么您将从前缀文件构建正则表达式并将其锚定在字符串的开头:

$prefixes = Get-Content 'P:\some\path\to\PrefixOfClientNames.txt' |
            ForEach-Object { [regex]::Escape($_) }

$pattern = '^{0}' -f ($prefixes -join '|')

然后使用管道移动匹配文件:

Get-ChildItem -Path $search_folder | Where-Object {
    $_.Name -match $pattern
} | Move-Item -Destination $destination_folder -WhatIf

答案 1 :(得分:0)

其他方法

$file_list = Get-Content "C:\Temp\prefix.txt" | %{$_ + '*'}
$search_folder = "C:\Temp\searchfolder"
$destination_folder = "C:\Temp\searchfolder"

Get-ChildItem $search_folder -file -Recurse | %{

$name=$_.BaseName
$fullname=$_.FullName 

 if (($file_list | where { $name -like $_} | select -First 1).Count -gt 0)
 {
   Move-Item $fullname $destination_folder -WhatIf

 }

}