在名称中搜索字符串并根据它移动文件

时间:2016-01-27 13:36:09

标签: csv powershell

我正在尝试导入 CSV文件并循环遍历所有条目以搜索匹配项(文件名也将在名称中包含其他字符串),之后,我希望它将匹配项放入适当的目录,以CSV文件命名

例如:

我有的文件:

Rapport PTP(12314)

测试(124523)

我想:

./ 12314 / Rapport PTP(12314)

./ 12314 / Rapport PTP(12453)

我的CSV文件包含需要通过目录搜索的所有数字。

编辑:到目前为止,我已经想出了这个,但由于某些原因,它只是假装......

Set-Location "d:\PTP" 

$Folders = Import-Csv D:\data\Documents\buse1.csv
$FileList = Get-ChildItem -Path D:\PTP 

ForEach ($Folder in $Folders) { 
 foreach ($File in $FileList) {
    $contains = $File.Name -like "*$($Folder.Name)*"
    if ($contains) {
        $Destination = 'd:\test1\{0}' -f, $folder.name;
        mkdir -Path (Split-Path -Path $Destination -Parent) -ErrorAction     SilentlyContinue;
        Move-Item -Path $folder.Name -Destination $Destination -WhatIf;
    }

}

} 

1 个答案:

答案 0 :(得分:0)

这就是你的逻辑之旅:

$File.Name -contains $Folder.Name;
if($contains){
    # ...
}

-contains适用于集合(数组,列表,枚举),但不进行子字符串搜索:

PS> "Long","string" -contains "string"
True
PS> "Long string" -contains "string"
False

在进行字符串比较时使用-match-like

$File.Name -like "*$($Folder.Name)*"

或:

$File.Name -match [regex]::Escape($Folder.Name)

此外,$contains不存在 - 您需要为其if()语句分配比较结果:

$contains = $File.Name -like "*$($Folder.Name)*"
if($contains){
    # We got a match!
}

或执行里面的 if()语句:

if($File.Name -match [regex]::Escape($Folder.Name)){
    # We got a match!
}