Powershell скопировать файл в папку, если имя файла содержит foldername - PullRequest
0 голосов
/ 19 мая 2019

Я попытался запустить следующий код, чтобы отсортировать некоторые банковские документы по соответствующим папкам. Если имя файла содержит имя папки из того же каталога, файл следует переместить в соответствующую папку. Если ни одно из следующих имен не является частью имени файла, соответствующий файл следует переместить в папку Other.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

$FileType = "*.pdf"
$folder = Get-ChildItem -path "C:\Users\Myname\Documents" -Filter $FileType

$map = @{
    Wertpapierabrechnung = "*$Wertpapierabrechnung*"
    Wertpapierertrag = "*_Wertpapierertrag*"
    Kontoauszug = "*$Kontoauszug*"
    Depotauszug = "*$Depotauszug*"
    Kapitalmaßnahmen = "*$Kapitalmaßnahmen*"
}

ForEach($file in $folder)
{
    $file
    $key = $file.BaseName
    $key
    $map.Keys
    if ($key -like $map.Keys){

        Copy-Item -Path $file.FullName -Destination ### SOME PATH JOINING ###

        }
    else{

    "Copy Item did not work."}
}

Однако я всегда бегаю через цикл else. Я не мог понять, почему. Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 20 мая 2019

Не совсем понятно, как выглядят детали, которые вы ищете, и как называются папки.

Пример дерева перед:

> tree /F
│   bar Wertpapierertrag 2016-04-08.pdf
│   baz Kontoauszug 2018-01-30.pdf
│   blah Depotauszug 2017-10-15.pdf
│   foo other 2019-05-19.pdf
│   foo Wertpapierabrechnung 2017-10-15.pdf
│   test Kapitalmaßnahmen 2016-04-08.pdf
│
├───Depotauszug
├───Kapitalmaßnahmen
├───Kontoauszug
├───Other
├───Wertpapierabrechnung
└───Wertpapierertrag

Запуск этого скрипта

## Q:\Test\2019\05\19\SO_56211858.ps1
$Folder = [Environment]::GetFolderPath("MyDocuments") 
$FileType = "*.pdf"
$Files = Get-ChildItem -Path $Folder -Filter $FileType

$RE = [regex]"(Kapitalmaßnahmen|Kontoauszug|Wertpapierabrechnung|Wertpapierertrag|Depotauszug)"
# alternativly build the RegEx from current subfolder names (might need escaping)
# $RE = [regex]((Get-ChildItem -Path $Folder -Directory -Name) -Join '|')

ForEach($file in $Files){
    if ($file.BaseName -Match $RE){
        $file | Move-Item -Destination (Join-Path $Folder $Matches[0]) -WhatIf
    } else {
        $file | Move-Item -Destination (Join-Path $Folder "Other") -WhatIf
    }
}

Если вывод выглядит нормально, удалите конечные параметры -WhatIf.

Дерево после запуска сценария:

> tree /F

├───Depotauszug
│       blah Depotauszug 2017-10-15.pdf
│
├───Kapitalmaßnahmen
│       test Kapitalmaßnahmen 2016-04-08.pdf
│
├───Kontoauszug
│       baz Kontoauszug 2018-01-30.pdf
│
├───Other
│       foo other 2019-05-19.pdf
│
├───Wertpapierabrechnung
│       foo Wertpapierabrechnung 2017-10-15.pdf
│
└───Wertpapierertrag
        bar Wertpapierertrag 2016-04-08.pdf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...