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 - сейчас скрипт только выводит сведения.
|
Батник: не меняет названия они остаются такие же
|
DJ Mogarych |
24-10-2023 15:24 3018782 |
-whatif убрали?
|
Да, осталась команда такой:
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')}
|
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 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
|
А можно будет добавить в бат, чтобы добавлялось время, в конце после "_"
Код:
@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
|
Цитата:
Цитата 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
Лучше добавлять что-то уникальное на каждый момент переименования, например, мгновения времени. »
|
ИМХО, при таком подходе получим плохо читаемые имена файлов.
|
Спасибо большое, очень помогли :up:
|
Время: 12:06.
© OSzone.net 2001-