Вопрос или проблема
Ниже приведен скрипт, который мне нужен
- Сравнить набор имен входных файлов в текущей папке с именами подпапок в целевой папке, указанной в командной строке (-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)
, как вы указали в своих примерах. -
Проверка существования каталога: Перед перемещением файлов мы проверяем, существует ли каталог проверки. Если его нет, мы создаем его.
-
Сообщения о действиях: Я добавил сообщения в консоль, чтобы вы могли видеть, какие файлы были перемещены и из-за каких папок они были определены как совпадающие.
Пример использования:
Чтобы запустить этот сценарий, сохраните его в файл, например, CompareFilesAndFolders.ps1
, а затем выполните его из PowerShell:
.\CompareFilesAndFolders.ps1 -targetDir "C:\Path\To\Your\Target\Directory"
Это должно соответственно обработать ваши файлы и подкаталоги, перемещая совпадающие элементы в каталог проверки. Если у вас есть дополнительные вопросы или вам нужно больше помощи, дайте знать!