Мне нужен скрипт PowerShell для сравнения имени файла с именем папки с использованием регулярных выражений.

Вопрос или проблема

Ниже приведен скрипт, который мне нужен

  • Сравнить набор имен входных файлов в текущей папке с именами подпапок в целевой папке, указанной в командной строке (-targetdir)
  • Все, что внутри квадратных скобок, и любые предшествующие пробелы исключаются из сравнения
  • Любые совпадения перемещаются в папку для проверки

Например:

  • Fish.txt должен соответствовать Fish
  • Fish.txt должен соответствовать Fish [xxx]
  • Fish (1).txt должен соответствовать Fish (1)
  • Fish (1) [2].txt должен соответствовать Fish (1)
  • Fish (2).txt не должен соответствовать Fish (1)

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

param (
    [string]$targetDir
)

# Определяем исходный и проверочный каталоги
$sourceDir = Get-Location
$checkDir = Join-Path -Path $sourceDir -ChildPath "check"

# Функция для удаления текста внутри квадратных скобок
function Remove-Brackets {
    param (
        [string]$input
    )
       return $input -ireplace "\s?\[.*?\]", ""
}

# Получаем список файлов в исходном каталоге
$sourceFiles = Get-ChildItem -Path $sourceDir -File

# Получаем список папок в целевом каталоге
$targetFolders = Get-ChildItem -Path $targetDir -Directory

# Сравниваем и перемещаем файлы
foreach ($file in $sourceFiles) {
    $fileName = Remove-Brackets -input $file.Name
    foreach ($folder in $targetFolders) {
        $folderName = Remove-Brackets -input $folder.Name
        if ($fileName -eq $folderName) {
            Move-Item -Path $file.FullName -Destination $checkDir
            break
        }
    }
}

Ответ или решение

Конечно! Ваш сценарий PowerShell уже имеет хорошую основу для реализации задуманного. Я помогу улучшить его, добавив необходимые изменения для правильного применения регулярных выражений и обработки случаев, когда названия файлов имеют дополнительные символы.

Вот переработанный сценарий, который отвечает вашим требованиям:

param (
    [string]$targetDir
)

# Определяем исходный каталог и каталог проверки
$sourceDir = Get-Location
$checkDir = Join-Path -Path $sourceDir -ChildPath "check"

# Создаем каталог проверки, если он не существует
if (-not (Test-Path -Path $checkDir)) {
    New-Item -ItemType Directory -Path $checkDir
}

# Функция для удаления текста в квадратных скобках
function Remove-Brackets {
    param (
        [string]$input
    )
    # Удаляем текст в квадратных скобках, включая предшествующие пробелы
    return $input -ireplace "\s?\[.*?\]", "" -ireplace "\s*\(.*?\)", ""
}

# Получаем список файлов в исходном каталоге
$sourceFiles = Get-ChildItem -Path $sourceDir -File

# Получаем список папок в целевом каталоге
$targetFolders = Get-ChildItem -Path $targetDir -Directory

# Сравниваем и перемещаем файлы
foreach ($file in $sourceFiles) {
    $fileName = Remove-Brackets -input $file.BaseName  # Убираем текст в скобках из названия файла
    foreach ($folder in $targetFolders) {
        $folderName = Remove-Brackets -input $folder.Name  # Убираем текст в скобках из имени папки
        if ($fileName -eq $folderName) {
            Move-Item -Path $file.FullName -Destination $checkDir
            Write-Host "Файл '$($file.Name)' перемещен в каталог проверки из-за совпадения с папкой '$($folder.Name)'."
            break
        }
    }
}

Описание изменений:

  1. Удаление скобок: Мы добавили обработку для круглых скобок, чтобы ваш сценарий мог игнорировать обернутые в круглые скобки обозначения, такие как (1), как вы указали в своих примерах.

  2. Проверка существования каталога: Перед перемещением файлов мы проверяем, существует ли каталог проверки. Если его нет, мы создаем его.

  3. Сообщения о действиях: Я добавил сообщения в консоль, чтобы вы могли видеть, какие файлы были перемещены и из-за каких папок они были определены как совпадающие.

Пример использования:

Чтобы запустить этот сценарий, сохраните его в файл, например, CompareFilesAndFolders.ps1, а затем выполните его из PowerShell:

.\CompareFilesAndFolders.ps1 -targetDir "C:\Path\To\Your\Target\Directory"

Это должно соответственно обработать ваши файлы и подкаталоги, перемещая совпадающие элементы в каталог проверки. Если у вас есть дополнительные вопросы или вам нужно больше помощи, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...