Powershell - рекурсивно добавлять текст в конец имен файлов в подкаталогах - PullRequest
1 голос
/ 23 апреля 2020

Обзор

Привет StackOverflow!

Я надеюсь, что кто-то здесь может мне помочь.

Я добавил следующий код для добавления текст в конец имени файла на сетевом диске. Рассматриваемые файлы - это, в основном, файлы «.zip», и обычно они содержат от 6 до 8 подкаталогов в родительской папке с 8–10 файлами «.zip» на подкаталог.

Что я надеюсь Достигнуть - рекурсивно добавлять текст в конец каждого имени файла.

Код:

#Current Directory of creatives
$fileLocation = read-host "Type/Paste location of creatives"

if (Test-Path \\serverPath\name\* -PathType Leaf) {
    $serverPathName = "\\serverPath\name\"
    $driveLetter = "D:\"
    $fileLocation = ($fileLocation -replace [regex]::Escape($serverPathName),$driveLetter)
}
$fileLocation = Resolve-Path $fileLocation
Write-Output $fileLocation

$newText = read-host "Please enter text to append"
$newText = $newText -replace '\s','-'

$addMarket = read-host "Are folders split by market? [Y/N]"

$ZipFiles = Get-ChildItem -Path "$currentDirectory" -Recurse -Filter "*.zip"

if ($addMarket -eq "N") {
    foreach  ($Zipfile in $ZipFiles) {
        Get-ChildItem | %{$_|rename-item -NewName ((($_.BaseName -replace '\s','-') + "-" + $newText + $_.Extension))}
    }
}
elseif($addMarket -eq "Y") {
    foreach  ($Zipfile in $ZipFiles) {
        Get-ChildItem -File -Recurse | Rename-Item -NewName {(($_.BaseName -replace '\s','-')  + "-" + (($_.Directory.Name -replace '\s','-')) + "-" + $newText + $_.Extension).ToLower()}
    }
}
else {
    write-host "ERROR! Incorrect Input!"
    Write-Host "Exiting Script..."
    Exit
}

#Clear Console
clear
#Read-Host -Prompt “Press Enter to exit”

Текущая ситуация:

Когда я запускаю вышеупомянутое (без функции l oop), оно работает нормально, но я должен войти в каждый подкаталог и запустить скрипт прямо там - что, очевидно, отнимает много времени и однообразно.

Когда я запускаю его в l oop, он работает, но работает долго, пока не будет достигнуто общее количество файлов .zip. например, 8 вложенных папок, 9 ".zip" = циклы 72 раза - каждый раз добавляя один и тот же текст.

Ожидаемая ситуация:

I wi sh to запустите сценарий из родительской папки вложенных папок, и сценарий добавит текст только один раз для каждого вложенного каталога во все «.zip», а затем закроет сценарий.

Проблема (?)

Я полагаю, что проблема заключается в следующей переменной:

$ ZipFiles

Но я не могу выяснить, как исправить это. Я установил его, чтобы найти все ".zip" файлы в родительской папке. Я также настроил его на подсчет количества файлов на один подкаталог:

Get-ChildItem -Directory | ForEach-Object { Write-Host $_.FullName $(Get-ChildItem $_ | Measure-Object).Count}

Но ни один из них не сработал для меня.

Резюме:

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

Спасибо за чтение!

Раджив Ахмед

1 Ответ

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

В вашем коде есть некоторые ошибки / ошибки:
- вы просите предоставить $fileLocation, но вы не используете его в своем коде.
- Вместо этого вы используете переменную $currentDirectory, но это не определено.
- Затем вы собираете все zip-файлы в переменную $ZipFiles, перебираете этот массив, где у вас уже есть zip-файлы, но вы используете Get-ChildItem, чтобы получить их снова. ;-)

Нечто подобное должно работать на самом деле:

$fileLocation = read-host "Type/Paste location of creatives"

if (Test-Path \\serverPath\name\* -PathType Leaf) {
    $serverPathName = "\\serverPath\name\"
    $driveLetter = "D:\"
    $fileLocation = ($fileLocation -replace [regex]::Escape($serverPathName), $driveLetter)
}
$fileLocation = Resolve-Path $fileLocation
Write-Output $fileLocation

$newText = read-host "Please enter text to append"
$newText = $newText -replace '\s', '-'

$addMarket = read-host "Are folders split by market? [Y/N]"

if ($addMarket -eq "N") {
    Get-ChildItem -Path $fileLocation -Recurse -Filter "*.zip" -File |  
    ForEach-Object { 
        Rename-Item -Path $_.FullName -NewName ((($_.BaseName -replace '\s', '-') + "-" + $newText + $_.Extension)) 
    }
}
elseif ($addMarket -eq "Y") {
    Get-ChildItem -Path $fileLocation -Recurse -Filter "*.zip" -File |  
    ForEach-Object { 
        Rename-Item -Path $_.FullName -NewName ((($_.BaseName -replace '\s', '-') + "-" + (($_.Directory.Name -replace '\s', '-')) + "-" + $newText + $_.Extension).ToLower())
    }
}
else {
    write-host "ERROR! Incorrect Input!"
    Write-Host "Exiting Script..."
    Exit
}

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