Показать полную графическую версию : [решено] Групповая замена символа в именах файлов
fullstopru
25-07-2018, 21:13
Добрый вечер. Объясните как переименовать несколько файлов, а именно заменить в них "@" на "-", сразу. Я знаю что подобные темы здесь давно были и закрыты, но моя ситуация отягощается тем, что я "чайник" и не представляю что делать со скриптами. Хорошие новости в том, что, в принципе, я сообразительный. Заранее спасибо за помощь.
На PowerShell:
Get-ChildItem -Path 'C:\Temp' -Include '*@*.*' -Recurse | ForEach-Object -Process {
if(-not $_.PSIsContainer) {
Rename-Item -Path $_.FullName -NewName "$($_.BaseName -replace '@', '-')$($_.Extension)" -Force
}
}
fullstopru
25-07-2018, 21:55
Get-ChildItem -Path 'C:\Temp' -Include '*@*.*' -Recurse | ForEach-Object -Process {
if(-not $_.PSIsContainer) {
Rename-Item -Path $_.FullName -NewName "$($_.BaseName -replace '@', '-')$($_.Extension)" -Force
}
} »
153467
fullstopru
25-07-2018, 22:04
PS. Пардон, менять надо не "@" а "@ " (после собаки еще и пробел).
megaloman
25-07-2018, 22:30
cmd@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\Box_In"
Set "S1=@ "
Set "S2=-"
For %%i IN ("%BoxIn%\*%S1%*.*") DO Set "nf=%%~nxi" &ren "%%i" "!nf:%S1%=%S2%!"
fullstopru
25-07-2018, 22:41
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set "BoxIn=Z:\Box_In"
Set "S1=@ "
Set "S2=-"
For %%i IN ("%BoxIn%\*%S1%*.*") DO Set "nf=%%~nxi" &ren "%%i" "!nf:%S1%=%S2%!" »
153469
megaloman
25-07-2018, 23:09
fullstopru,
ничего не понимаю.
1. Во первых, код надо сохранить в файл с расширением .bat
2. Во вторых надо указать в коде Ваш реальный путь к файлам вместо моего Set "BoxIn=Z:\Box_In"
3. На выполнение запускать bat-файл
fullstopru
25-07-2018, 23:33
3. На выполнение запускать bat-файл »
153472
Снимок экрана (1).png »
Вы нажимаете Ctrl-V в два раза больше, нежели следует ;).
PS. Пардон, менять надо не "@" а "@ " (после собаки еще и пробел). »
Так добавьте этот пробел в оба используемых места:
Get-ChildItem -Path 'C:\Мои проекты\0177' -Include '*@ *.*' -File -Recurse | ForEach-Object -Process {
Write-Host $_.FullName
Rename-Item -Path $_.FullName -NewName "$($_.BaseName -replace '@ ', '-')$($_.Extension)" -Force
}
(теперь мне опять доступен PowerShell V5, и пусть будет -File вместо if(-not $_.PSIsContainer) :).
Снимок экрана (3).png »
А что за запись "CD d/ z:\", и тем более "CD с/ z:\"??
Вы уж повнимательней делайте то, что вам пишут и что вы видите...
Ну а выход из PowerShell осуществляется не по Ctrl+С (^C, что у вас на снимке (1)), а командой exit.
Iska, сложно - проще у Get-ChildItem сразу указать ключ -File, а вместо -Include использовать -Filter - он гораздо быстрее (https://www.computerperformance.co.uk/powershell/powershell_file_gci_filter.htm)., оператор -replace работает с регулярками, безопаснее использовать метод:
Get-ChildItem c:\temp -Filter *@ *.* -File -Recurse | Rename-Item -NewName { $_.BaseName.Replace('@ ','-')+$_.Extension } -WhatIf
Iska, сложно - проще у Get-ChildItem сразу указать ключ -File, »
Во время написания первого кода у меня под рукой был только PowerShell V.2.0 :).
Iska, там должен -Attributes !Directory работать
Iska, там должен -Attributes !Directory работать »
Не должен, т.к. параметр Attributes добавили в PowerShell v 3.0.
Просто надо было не выпендриваться, а сразу, с первой же версии, привыкать к какому-нибудь if([System.IO.File]::Exists($_.FullName)) {…} :).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.