Powershell - рекурсивно заменить некоторые символы в пути к папке Windows

Я пытаюсь создать скрипт Powershell, который позволяет переименовывать некоторые папки, содержащие специальные символы. Я использую функцию, которая очищает строку, а затем переименовывает элемент с правильным именем, но у меня возникают проблемы, когда я пытаюсь «вникнуть» в путь.

Пример:

$Destination = "C:\Users\Images\blabla#\ecc&"
$folderspaths= Get-ChildItem -Path $Destination -Directory -Recurse | Select FullName, Name 

$folders path gives me a series of path and the folder name. That's correct. But here's the "wrong" part:
(Sanitize is the replace function, that works like a charm with variable pathCheck)


foreach ($folderpath in $folderpaths){
  $TEMPORARYDEST= $folderpath.FullName
  $NewName= Sanitize -PathCheck $folderpath.Name
   
   if ($folderpath.Name -ne $NewName){
     Rename-Item -$TEMPORARYDEST -NewName $NewName
     
   }else {
     Write-Host "No special characters found in $($folderpath.FullName)"
   }
 
}
  

Это работает, потому что переименовывает папки, содержащие специальные символы, с «». Но когда я углубляюсь, он ошибается.

Поскольку я заменяю специальные символы, содержащиеся в дочернем элементе get, но этот массив не «обновляется», поэтому, когда я пытаюсь переименовать «ecc&», он ожидает найти специальные символы в папке родительского имени.

Не могли бы вы мне помочь?

Спасибо.

Пытался заменить бары на "", чтобы очистить всю строку, но это не сработало

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вместо foreach вы можете попробовать использовать функцию while и переопределить переменную после переименования.

В моем примере у меня есть три папки, рекурсивно хранящиеся в C:\Temp. Я определяю $folderpaths один раз в начале и переименовываю первую папку. После этого я переопределяю переменную, но исключаю только что переименованную папку. Возможно, этот подход может помочь вам.

$Destination = "C:\Temp"
$folderpaths = Get-ChildItem -Path $Destination -Directory -Recurse | select FullName



while ($folderpaths){
        $NewName = "RenamedFolder"
        if ($folderpaths[0].FullName -ne $NewName){
            Rename-Item $folderpaths[0].FullName -NewName $NewName
            $folderpaths = Get-ChildItem -Path $Destination -Directory -Recurse | select fullname | where {$_.FullName -notlike "*$newname"}
        }
        
    }
$folderpaths = $null
Ответ принят как подходящий

Я заметил ошибку в своем сценарии. Это работало нормально, пока $NewName всегда было одним и тем же значением. Но он застрял в цикле while, если нет.

Я не совсем уверен в вашей функции, но смог решить проблему с помощью этого:

$Destination = "$env:temp\folder1"
$folderpaths = Get-ChildItem -Path $Destination -Directory -Recurse


while ($folderpaths){
        $NewName = $folderpaths[0].Name.Replace(";","").Replace("'","").Replace("-","").Replace("#","")
        if ($folderpaths[0].FullName -ne $NewName){
            Rename-Item $folderpaths[0].FullName -NewName $NewName
            $folderpaths = Get-ChildItem -Path $Destination -Directory -Recurse | where {$_.Name -like "*;*" -or $_.Name -like "*'*" -or $_.Name -like "*-*" -or $_.Name -like "*#*"}
        }
        
    }
$folderpaths = $null

Вместо функции Sanitize я сразу же использовал функцию Replace при создании $NewName и позже отфильтровал только имена папок с ; ' - или # в нем. Я думаю, вам не нужно фильтровать *, так как вы не можете использовать это в имени папки. Может быть, возьми пару папок и попробуй эту.

Другие вопросы по теме