Войти

Показать полную графическую версию : [решено] Групповая замена символа в именах файлов


fullstopru
25-07-2018, 21:13
Добрый вечер. Объясните как переименовать несколько файлов, а именно заменить в них "@" на "-", сразу. Я знаю что подобные темы здесь давно были и закрыты, но моя ситуация отягощается тем, что я "чайник" и не представляю что делать со скриптами. Хорошие новости в том, что, в принципе, я сообразительный. Заранее спасибо за помощь.

Iska
25-07-2018, 21:29
На 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

Iska
26-07-2018, 00:12
Снимок экрана (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) :).

mwz
26-07-2018, 00:42
Снимок экрана (3).png »

А что за запись "CD d/ z:\", и тем более "CD с/ z:\"??

Вы уж повнимательней делайте то, что вам пишут и что вы видите...

Ну а выход из PowerShell осуществляется не по Ctrl+С (^C, что у вас на снимке (1)), а командой exit.

Busla
26-07-2018, 11:40
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
26-07-2018, 11:55
Iska, сложно - проще у Get-ChildItem сразу указать ключ -File, »
Во время написания первого кода у меня под рукой был только PowerShell V.2.0 :).

Busla
26-07-2018, 13:14
Iska, там должен -Attributes !Directory работать

Kazun
26-07-2018, 13:27
Iska, там должен -Attributes !Directory работать »
Не должен, т.к. параметр Attributes добавили в PowerShell v 3.0.

Iska
26-07-2018, 13:47
Просто надо было не выпендриваться, а сразу, с первой же версии, привыкать к какому-нибудь if([System.IO.File]::Exists($_.FullName)) {…} :).




© OSzone.net 2001-2012