Показать полную графическую версию : [решено] 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
"Батник":
powershell -command "dir 'D:\temp' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s') -whatif}"
Поменяйте путь на свой, после проверки работоспособности уберите -whatif - сейчас скрипт только выводит сведения.
Батник: не меняет названия они остаются такие же
DJ Mogarych
24-10-2023, 15:24
-whatif убрали?
Да, осталась команда такой:
powershell -command "dir 'C:\Temp\1' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s')}"
Через командную строку сработало, но не работает через батник
DJ Mogarych
24-10-2023, 17:21
Понятно. Лучше запускать это в родном powershell, а именно - создать файл script.ps1 и запускать его по ПКМ "Выполнить с помощью Powershell"
dir 'C:\Temp\1' -Recurse |? psiscontainer -eq $false |% {Rename-Item $_.fullname ($_.name -replace '!|,|\s')}
megaloman
24-10-2023, 20:37
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
А можно написать исключения, когда файл повторяет название добавлять "_"в конце
DJ Mogarych
25-10-2023, 11:02
Заманаешься так добавлять, потому что может возникнуть ситуация, когда после переименования будет несколько файлов с одинаковыми именами.
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
А можно будет добавить в бат, чтобы добавлялось время, в конце после "_"
@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
А можно написать исключения, когда файл повторяет название добавлять "_"в конце »@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 01aqwertyuiop.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
Лучше добавлять что-то уникальное на каждый момент переименования, например, мгновения времени. »ИМХО, при таком подходе получим плохо читаемые имена файлов.
Спасибо большое, очень помогли :up:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.