Как отсортировать файлы в папках по именам - PullRequest
1 голос
/ 01 октября 2019

Здравствуйте, я впервые использую Powershell, и я хотел бы отсортировать мои файлы (пример имени: 5035 facture coop.pdf) по 4 первым цифрам в их именах и переместить их в другие папки (например, имена: 5100 субвенция). , 5150 донов, 5200 копеек и т. Д.)

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

пример: 5035 фактура X.pdf будет помещаться в папку 5100 субвенции, но 5101 фактура y.pdf будет помещаться в папку 5150 dons

Я пытался собрать некоторый код из другого места вфорум и другой форум, но мне не удалось, несчастно

Папка, в которой находятся файлы

$TopFolder = "C:\Users\Administration\Desktop\scannes"

Папка, в которой расположены папки назначения

$destination = "C:\Users\Administration\Desktop\comptabilité essai"

Получение файлов

$Folders = gci $TopFolder -OutVariable Files | ? { $_.PSisContainer }

Цикл по всем файлам с расширением * .docx

$Files | ? { $_.Extension -eq '.docx' } | % {

    # Split FileName to get the number
    $num = ($_.Name -split " ")[0]

    # Get FolderName and compare it to number
    $MoveTo = $destination | ? { $_.Name.substring(0,4) -ge $num }

    # If a folder was found, move file there. else print error
    if ($MoveTo)
    {
        Move-Item $_.FullName $MoveTo 
        Write-Host "Copied File $($_.Name) to $MoveTo"
    }
    else 
    { 
        Write-Host "Did not find folder $($num) in $TopFolder" 
    }
}

Я не знаю, как сделать правило для меньшего или равного, но большего, чем для другой папки, И оно невообще не работает.

1 Ответ

1 голос
/ 01 октября 2019

Опираясь на комментарии mjsqu, если вы установите для переменной $destination значение.

$destination = Get-ChildItem -Path "C:\Users\Administration\Desktop\comptabilité essai" -Directory

и измените строку $MoveTo = ... на

$MoveTo = $destination | ? { $_.Name.substring(0,4) -ge $num } | Sort-Object -Property Name | Select-Object -First 1

, в результате чего $MoveTo будет содержать первую папку с именем, превышающим число.

Тогда вам может потребоваться изменить строку Move-Item $_.FullName $MoveTo, указав Move-Item $_.FullName $MoveTo.FullName, чтобы получить имя каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...