Я пытаюсь создать скрипт 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&», он ожидает найти специальные символы в папке родительского имени.
Не могли бы вы мне помочь?
Спасибо.
Пытался заменить бары на "", чтобы очистить всю строку, но это не сработало
Вместо 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 и позже отфильтровал только имена папок с ; ' - или # в нем. Я думаю, вам не нужно фильтровать *, так как вы не можете использовать это в имени папки. Может быть, возьми пару папок и попробуй эту.