Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Групповая замена символа в именах файлов (http://forum.oszone.net/showthread.php?t=335879)

fullstopru 25-07-2018 21:13 2823490

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

Iska 25-07-2018 21:29 2823493

На 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 2823497

Вложений: 1
Цитата:

Цитата Iska
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 2823498

PS. Пардон, менять надо не "@" а "@ " (после собаки еще и пробел).

megaloman 25-07-2018 22:30 2823499

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 2823503

Вложений: 1
Цитата:

Цитата megaloman
@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 2823507

Вложений: 1
fullstopru,
ничего не понимаю.
1. Во первых, код надо сохранить в файл с расширением .bat
2. Во вторых надо указать в коде Ваш реальный путь к файлам вместо моего Set "BoxIn=Z:\Box_In"
3. На выполнение запускать bat-файл

fullstopru 25-07-2018 23:33 2823508

Вложений: 1
Цитата:

Цитата megaloman
3. На выполнение запускать bat-файл »

Файл 153472

Iska 26-07-2018 00:12 2823513

Цитата:

Цитата fullstopru
Снимок экрана (1).png »

Вы нажимаете Ctrl-V в два раза больше, нежели следует ;).

Цитата:

Цитата fullstopru
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 2823514

Цитата:

Цитата fullstopru
Снимок экрана (3).png »

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

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

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

Busla 26-07-2018 11:40 2823551

Iska, сложно - проще у Get-ChildItem сразу указать ключ -File, а вместо -Include использовать -Filter - он гораздо быстрее., оператор -replace работает с регулярками, безопаснее использовать метод:
Код:

Get-ChildItem c:\temp -Filter *@ *.* -File -Recurse | Rename-Item -NewName { $_.BaseName.Replace('@ ','-')+$_.Extension } -WhatIf

Iska 26-07-2018 11:55 2823552

Цитата:

Цитата Busla
Iska, сложно - проще у Get-ChildItem сразу указать ключ -File, »

Во время написания первого кода у меня под рукой был только PowerShell V.2.0 :).

Busla 26-07-2018 13:14 2823560

Iska, там должен -Attributes !Directory работать

Kazun 26-07-2018 13:27 2823561

Цитата:

Цитата Busla
Iska, там должен -Attributes !Directory работать »

Не должен, т.к. параметр Attributes добавили в PowerShell v 3.0.

Iska 26-07-2018 13:47 2823562

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


Время: 08:36.

Время: 08:36.
© OSzone.net 2001-