Попытка использовать PowerShell для помещения файлов в папки в зависимости от их расширения и имени папки. - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть каталог с тремя файлами: .xlsx, .docx и .txt, у меня также есть папки в том же каталоге, называемые xlsx, docx и txt. В основном, пытаясь поместить каждый файл в соответствующую папку, чтобы попрактиковаться в моих навыках PowerShell. Я очень новичок в PowerShell и пробовал следующее. Я могу сказать, что это неправильно, но я не совсем уверен, почему.

$folders = Get-ChildItem -Directory
$files = Get-ChildItem -File
foreach ($file in $files) {
        foreach ($folder in $folders) {
                 if ("*$file.extension*" -like "*$folder.Name*") {
                         move-item $file -Destination "C:\Users\userA\Desktop\$folder.name"
                 }
         }
}

Ответы [ 3 ]

2 голосов
/ 11 апреля 2020

Попробуйте код ниже. С помощью функции Where-Object вы найдете соответствующий файл. Я удаляю точку, потому что в противном случае она включена в расширение.

$folders = Get-ChildItem -Directory

$files = Get-ChildItem -File

foreach ($file in $files) {
    $folder = $folders | Where-Object { $_.Name -Like $file.Extension.Replace(".","") }
    Move-Item -Path $file -Destination $folder
}

В вашем примере будьте осторожны с тем, как на самом деле интерпретируются ваши строки. Если у вас есть "*$item.Name*" строка на самом деле "* переменная .Name *". В этом случае вам нужно использовать "*$($var.Name)*", чтобы получить правильную строку.

0 голосов
/ 11 апреля 2020

Вы можете даже создать целевые папки для расширений, если они еще не существуют:

$SourceFolder = C:\sample
$TargetFolder = D:\sample

Get-ChildItem -Path $SourceFolder -File |
    ForEach-Object{
        $DesinationFolder = Join-Path -Path $TargetFolder -ChildPath $_.Extension.TrimStart('.')
        if(-not (Test-Path -Path $DesinationFolder)){
            New-Item -Path $DesinationFolder -ItemType Directory | Out-Null
        }
        Copy-Item -Path $_.FullName -Destination $DesinationFolder -Force 
    }
0 голосов
/ 11 апреля 2020

Вот некоторые корректировки вашего подхода, которые заставляют его работать. Разбивая параметр -Destination на отдельную переменную $ newpath, вы можете установить там оператор отладки, чтобы вы могли легко изучить, что он создает.

$folders = Get-ChildItem -Directory
$files = Get-ChildItem -File
foreach ($file in $files) {
        foreach ($folder in $folders) {
                 if ($file.extension.trim(".") -like $folder.Name) {
                         $newpath = ("{0}\{1}" -f $folder.FullName, $file.Name)
                         move-item $file -Destination $newpath
                 }
         }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...