копировать соответствующие файлы с диска в папку на основе имени файла в PowerShell - PullRequest
0 голосов
/ 14 июля 2020

У меня есть куча языковых папок в каталоге под E: \ Data \, например hu-hu, de-de et c .. с другой стороны, у меня есть куча имен файлов в G: \ that содержат часть имени папки, например, amd64.de-de_OCR.cab, amd64.handwriting.de-de.cab

Мне нужно скопировать все совпадающие имена файлов на основе имени папки

для например, de-de должен скопировать все совпадающие файлы в G: \, то есть оба amd64.de-de_OCR.cab, amd64.handwriting.de-de.cab

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

$listfoldername = Get-ChildItem -Path "E:\Data" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object Name
$destfolder = Get-ChildItem -Path "E:\Data" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName
$filename = Get-ChildItem -file G:\
if($filename -like $listfoldername)
{
Copy-Item -Path $filename -Destination $destfolder
}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Есть несколько проблем с вашим кодом

  1. Основная проблема с вашим кодом заключается в том, что вы пытаетесь использовать оператор -like для сравнения двух объектов (ваш объект, содержащий каталоги вы должны sh перемещать файлы, и объект, содержащий файлы.

    • Что вам нужно сделать, это l oop через каждый файл и каталог, один за другим, чтобы определить, имя каталога (например, «ху-ху» находится в имени файла (например, amd64.hu-hu_OCR.cab)
  2. Вы захотите использовать подстановочный знак «* "с оператором -like (например, "*hu-hu*")

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

«G:» содержит папки:

  • de-de
  • hu-hu
  • us-us (обратите внимание, я добавил это, чтобы убедиться, что код не соответствует этому каталогу)

"E: \ Data" содержит файлы

  • amd64.de-de_OCR.cab
  • amd64.handwriting.de-de.cab
  • amd64.handwritinghu-hu.cab
  • amd64.hu-hu_OCR.cab
$FileDirectory = "G:" # Change to "G:\", the trailing slash breaks syntax highlight on SO
$DataDirectory = "E:\Data"

$listfoldername = Get-ChildItem -Path "$DataDirectory" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object Name
$filename = Get-ChildItem -file "$FileDirectory"

#Loop through each file one at a time
foreach ($file in $filename) {
    # Then, loop through each folder one at a time
    foreach ($folder in $listfoldername) {
        # Set the current filename and listfoldername to variables for later -like operator
        $FileString = $file.Name
        $FolderString = $folder.Name
        # If the current file "is like" the current folder name
        if($FileString -like "*$FolderString*")
            {
                # Set the name of the current folder to a variable
                $DataFolder = $folder.Name
                Copy-Item -Path "$FileDirectory\$FileString" -Destination "$DataDirectory\$DataFolder"
            } else {
                Write-Output ("$FolderString pattern not found in $FileString")
            }
    }
}
0 голосов
/ 14 июля 2020

Я думаю, вам следует начать со списка возможных целевых папок для языков. Затем введите l oop по пути, где находятся файлы, фильтруя их имена, чтобы в нем было хотя бы da sh, и затем проверьте, совпадает ли какая-либо из целевых папок языка с именем файла.

Примерно так :

$langFolder = 'E:\Data'
$fileFolder = 'G:\'          #'# dummy comment to fix syntax highlighting in SO

# get a list of the language folders
# if the languages folder has multiple subdirectories to include, add -Recurse here
$targetFolders = Get-ChildItem -Path $langFolder -Directory

# get a list of FileInfo objects for the files in the G:\ path
# if you need to search subdirectories aswell, add -Recurse here
$files = Get-ChildItem -Path $fileFolder -File -Filter '*-*.*'
foreach($file in $files) {
    # check if a language name matches the file name
    foreach($folder in $targetFolders) {
        if ($file.BaseName -like "*$($folder.Name)*") {
            # we have found a matching language target directory
            $file | Copy-Item -Destination $folder.FullName
            break  # exit this folder foreach loop and get on with the next file
        }
    }
}

PS Если все файлы являются .cab файлами, вы можете ускорить его, установив для фильтра значение '*-*.cab' в строке $files = Get-ChildItem ...

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