Поиск и замена имен файлов и папок с поддержкой TXT файлов - PullRequest
0 голосов
/ 24 февраля 2019

У меня много папок и внутри этих разных файлов.Каждая папка и ее дочерние файлы имеют одинаковые имена и разные расширения, поэтому в папке ABC находятся файлы ABC.png, ABC.prj, ABC.pgw, в папке DEF - DEF.png, DEF.prj,Файлы DEF.pgw и так далее.С помощью скрипта я создал текстовый файл со списком имен файлов PNG.Затем я вставил в строку 2 новое имя для имени в строке 1, в строке 4 новое имя для имени в строке 3 и так далее.Сейчас я ищу скрипт powershell, который: - сканирует все папки на наличие имени в строке 1 и заменяет его на имя в строке 2 - сканирует все папки на наличие имени в строке 3 и заменяет его на имя в строке 4 и т. Д.

У меня есть попытка с этим ниже, но это не работает.

У вас есть какие-нибудь предложения?Спасибо

$0=0
$1=1
do {
$find=Get-Content C:\1\Srv\MapsName.txt | Select -Index $0
$repl=Get-Content C:\1\Srv\MapsName.txt | Select -Index $1
Get-ChildItem C:\1\newmaps -Recurse | Rename-Item -NewName { $_.name -replace $find, $repl} -verbose
$0=$0+2
$1=$1+2
}
until ($0 -eq "")

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я считаю, что в вашем коде есть несколько ошибок, а также код, который вам дал Мануэль.

  1. Хотя у вас есть список старых и новых имен файлов, вы не используете его в Get-ChildItem, но вместо этого попробуйте заменить все найденные файлы.
  2. При использовании -replace используется замена регулярного выражения, что означает, что специальный символ . внутри имени файла рассматривается как Any Character, а не простоточка.
  3. Вы пытаетесь найти *.png файлы, но вы не добавляете -Filter с командлетом Get-ChildItem, поэтому теперь он вернет все типы файлов.

В любом случаеУ меня есть другой подход для вас:

Если ваш входной файл C:\1\Srv\MapsName.txt выглядит примерно так:

picture1.png
ABC_1.png
picture2.png
DEF_1.png
picture3.png
DEF_2.png

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

$mapsFile   = 'C:\1\Srv\2_MapsName.txt'
$searchPath = 'C:\1\NewMaps'

# Read the input file as an array of strings.
# Every even index contains the file name to search for. 
# Every odd index number has the new name for that file.
$lines = Get-Content $mapsFile

# Create a hashtable to store the filename to find
# as Key, and the replacement name as Value
$lookup = @{}
for ($index = 0; $index -lt $lines.Count -1; $index += 2) {
    $lookup[$lines[$index]] = $lines[$index + 1]
}

# Next, get a collection of FileInfo objects of *.png files
# If you need to get multiple extensions, remove the -Filter and add -Include '*.png','*.jpg' etc.
$files = Get-ChildItem -Path $searchPath -Filter '*.png' -File -Recurse

foreach ($file in $files) {
    # If the file name can be found as Key in the $lookup Hashtable
    $find = $file.Name
    if ($lookup.ContainsKey($find)) {
        # Rename the file with the replacement name in the Value of the lookup table
        Write-Host "Renaming '$($file.FullName)' -->  $($lookup[$find])"
        $file | Rename-Item -NewName $lookup[$find]
    }
}

Редактировать

Если входной текстовый файл 'C: \ 1 \ Srv \MapsName.txt 'НЕ содержит имен файлов, включая их расширение, измените заключительный цикл foreach на следующий:

foreach ($file in $files) {
    # If the file name can be found as Key in the $lookup Hashtable
    # Look for the file name without extension as it is not given in the 'MapsName.txt' file.
    $find = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
    if ($lookup.ContainsKey($find)) {
        # Rename the file with the replacement name in the Value of the lookup table
        # Make sure to add the file's extension if any.
        $newName = $lookup[$find] + $file.Extension
        Write-Host "Renaming '$($file.FullName)' --> '$newName'"
        $file | Rename-Item -NewName $newName
    }
}

Надеюсь, что поможет

0 голосов
/ 24 февраля 2019

Проблема в вашем фрагменте состоит в том, что он никогда не заканчивается.Я попробовал это, и это работает, но продолжает работать вечно.Я создал папку с файлами a.txt, b.txt и c.txt.И в map.txt у меня есть это содержимое:

a.txt
a2.md
b.txt
b2.md
c.txt
c2.md

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

$0=0
$1=1

$find=Get-Content D:\map.txt | Select -Index $0
while($find) {
    $find=Get-Content D:\map.txt | Select -Index $0
    $repl=Get-Content D:\map.txt | Select -Index $1

    if(!$find -Or !$repl) {
        break;
    }

    Get-ChildItem D:\Files -Recurse | Rename-Item -NewName { $_.name -replace $find, $repl} -verbose
    $0=$0+2
    $1=$1+2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...