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

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

Ilmira 24-10-2023 14:53 3018776

CMD/BAT -удалить из имени фаила пробелы и знаки "!" ","
 
Помогите написать скрипт для удаления пробелов и знаков"!" "," в названиях файлов. Нашла скрип для удаления пробелов никак не понимаю, как удалить знаки.

@echo off
setlocal

for /f "tokens=*" %%i in (' dir /b ') do call:ren "%%i"
goto:eof

:ren
set "file=%~1"
ren %1 %file: =%

DJ Mogarych 24-10-2023 15:12 3018779

"Батник":
Код:

powershell -command "dir 'D:\temp' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s') -whatif}"
Поменяйте путь на свой, после проверки работоспособности уберите -whatif - сейчас скрипт только выводит сведения.

Ilmira 24-10-2023 15:23 3018781

Батник: не меняет названия они остаются такие же

DJ Mogarych 24-10-2023 15:24 3018782

-whatif убрали?

Ilmira 24-10-2023 16:23 3018787

Да, осталась команда такой:
powershell -command "dir 'C:\Temp\1' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s')}"

Через командную строку сработало, но не работает через батник

DJ Mogarych 24-10-2023 17:21 3018794

Понятно. Лучше запускать это в родном powershell, а именно - создать файл script.ps1 и запускать его по ПКМ "Выполнить с помощью Powershell"
Код:

dir 'C:\Temp\1' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s')}

megaloman 24-10-2023 20:37 3018803

Ilmira, Чистый CMD
Код:

@Echo Off
        For %%f In (*.*) Do (
                Set "Name=%%f"
                Call Set "Name=%%Name: =%%"
                Call Set "Name=%%Name:!=%%"
                Call Set "Name=%%Name:,=%%"
                Call Ren "%%f" "%%Name%%"
        )
Exit /B


Ilmira 25-10-2023 09:41 3018837

А можно написать исключения, когда файл повторяет название добавлять "_"в конце

DJ Mogarych 25-10-2023 11:02 3018841

Заманаешься так добавлять, потому что может возникнуть ситуация, когда после переименования будет несколько файлов с одинаковыми именами.
Код:

ddd — к,опия.txt
ddd — ко,пия.txt
ddd — коп, ия.txt
ddd — копия (5).txt
ddd — копия.txt
ddd.txt

Лучше добавлять что-то уникальное на каждый момент переименования, например, мгновения времени.

Powershell:
Код:

$folder = 'C:\Temp\1'

$replace = '!|,|\s'
dir $folder -Recurse |? {$_.psiscontainer -eq $false -and $_.basename -match $replace} |% {
    $newName = $_.basename -replace $replace
    if (Test-Path "$($_.DirectoryName)\$newName$($_.extension)") {
        $newName = $newName + "_" + (get-date).Ticks
    }
    $newName = $newName + $_.extension
    Rename-Item $_.fullname $newName
}

Код:

ddd.txt
ddd—копия(5).txt
ddd—копия.txt
ddd—копия_638338282110101632.txt
ddd—копия_638338282110120695.txt
ddd—копия_638338282110156257.txt


Ilmira 25-10-2023 11:27 3018843

А можно будет добавить в бат, чтобы добавлялось время, в конце после "_"
Код:

@Echo Off
        For %%f In (*.*) Do (
                Set "Name=%%f"
                Call Set "Name=%%Name: =%%"
                Call Set "Name=%%Name:!=%%"
                Call Set "Name=%%Name:,=%%"
                Call Set "Name=%%Name:$=%%"
                Call Set "Name=%%Name:+=%%"
                Call Set "Name=%%Name:(=%%"
                Call Set "Name=%%Name:)=%%"
                Call Ren "%%f" "%%Name%%"
        )
       
Exit /B


megaloman 25-10-2023 15:21 3018860

Цитата:

Цитата Ilmira
А можно написать исключения, когда файл повторяет название добавлять "_"в конце »

Код:

@Echo Off
cls
        For %%f In (*.*) Do Call :MyRen "%%f"
pause
Exit /B

:MyRen
        Set "Name=%~n1"

        Set "Name=%Name: =%"
        Set "Name=%Name:!=%"
        Set "Name=%Name:,=%"

        If /I "%Name%"=="%~n1" Exit /B 0
        If Not Exist "%Name%%~x1" (Ren %1 "%Name%%~x1" &Exit /B 0)
        Set /A i=0
        :Begin
                Set /A i+=1
                If Exist "%Name%_%i%%~x1" GoTo :Begin
                Ren %1 "%Name%_%i%%~x1"
Exit /B 0

Добавляет _1 _2 ... в конце имени перед расширением при совпадении имен
Код:

1aqwertyuiop.txt
1aqwertyuiop_1.txt
1aqwertyuiop_2.txt
1bqwertyuiop.txt
1bqwertyuiop_1.txt
1bqwertyuiop_2.txt
1qwertyuiop.txt
1qwertyuiop_1.txt
1qwertyuiop_2.txt
2aqwertyuiop.txt
2aqwertyuiop_1.txt
2aqwertyuiop_2.txt
2bqwertyuiop.txt
2bqwertyuiop_1.txt
2bqwertyuiop_2.txt
2qwertyuiop.txt
2qwertyuiop_1.txt
2qwertyuiop_2.txt
3aqwertyuiop.txt
3aqwertyuiop_1.txt
3aqwertyuiop_2.txt
3bqwertyuiop.txt
3bqwertyuiop_1.txt
3bqwertyuiop_2.txt
3qwertyuiop.txt
3qwertyuiop_1.txt
3qwertyuiop_2.txt
hgfhjkldfghj.ggg

Цитата:

Цитата DJ Mogarych
Лучше добавлять что-то уникальное на каждый момент переименования, например, мгновения времени. »

ИМХО, при таком подходе получим плохо читаемые имена файлов.

Ilmira 26-10-2023 10:44 3018922

Спасибо большое, очень помогли :up:


Время: 12:06.

Время: 12:06.
© OSzone.net 2001-