Компьютерный форум 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=354021)

Adamm 15-08-2023 12:30 3013948

Заменить символы в названия папок
 
Всем привет!
Уважаемые программисты, можете помочь с написанием bat или CMD, суть вопроса, в названиях файла присутствуют символы C С или B В и т.д., они разные одна английская другая русская, а хотелось бы их заменить все на английские, а папок море в ручника это не выполнимо...)

DJ Mogarych 15-08-2023 13:31 3013955

Цитата:

Цитата Adamm
символы C С или B В и т.д. »

"И т. д." напишите полностью.

Adamm 15-08-2023 13:42 3013958

Е_E Т_T О_O Р_P А_A Н_H К_K Х_X С_C В_B М_M е_e т_t о_o р_p а_a н_h к_k х_x с_c в_b м_m
сущесвующая_заменяемая

YuS_2 15-08-2023 13:49 3013959

powershell поможет?

DJ Mogarych 15-08-2023 14:22 3013964

Как-то так (Powershell):
Код:

$hash = New-Object system.collections.hashtable
$hash.Е = "E"
$hash.Т = "T"
$hash.О = "O"
$hash.Р = "P"
$hash.А = "A"
$hash.Н = "H"
$hash.К = "K"
$hash.Х = "X"
$hash.С = "C"
$hash.В = "B"
$hash.М = "M"
$hash.е = "e"
$hash.т = "t"
$hash.о = "o"
$hash.р = "p"
$hash.а = "a"
$hash.н = "h"
$hash.к = "k"
$hash.х = "x"
$hash.с = "c"
$hash.в = "b"
$hash.м = "m"

$folders = dir 'D:\temp\log' -Recurse |? psiscontainer

foreach ($folder in $folders) {
    $newName = ($folder.name.ToCharArray() |% {
        if ($hash["$_"]) {$hash["$_"]}
        else {$_}
    }) -join ''
    Rename-Item $folder.FullName $newname -ErrorAction SilentlyContinue -WhatIf
}

Чтобы реально переименовывало, уберите -WhatIf после проверки.

YuS_2 15-08-2023 14:29 3013967

Код:

function trans {
        param(
                [parameter(mandatory=$true,valuefrompipeline=$true)]
                [allowemptystring()]
                [allownull()]
                [string]$fstring
        )
        begin {
                $charr = @{
                        [char]'А' = 'A'
                        [char]'а' = 'a'
                        [char]'В' = 'B'
                        [char]'в' = 'b'
                        [char]'Е' = 'E'
                        [char]'е' = 'e'
                        [char]'К' = 'K'
                        [char]'к' = 'k'
                        [char]'М' = 'M'
                        [char]'м' = 'm'
                        [char]'Н' = 'H'
                        [char]'н' = 'h'
                        [char]'О' = 'O'
                        [char]'о' = 'o'
                        [char]'Р' = 'P'
                        [char]'р' = 'p'
                        [char]'С' = 'C'
                        [char]'с' = 'c'
                        [char]'Т' = 'T'
                        [char]'т' = 't'
                        [char]'Х' = 'X'
                        [char]'х' = 'x'
                }
        }
        process{
                $arr = new-object system.text.stringbuilder
                foreach ($item in $fstring.tochararray()){
                        if ($charr[$item] -cne $null){
                                $null = $arr.append($charr[$item])
                        } else {
                                $null = $arr.append($item)
                        }
                }
        }
        end {$arr.tostring().trim("`n")}
}

#Здесь надо указать абсолютный путь к каталогу:
$folder = '.\TEST'

dir $folder -rec -file|%{
        ren $_.fullname $($_.name|trans)
}

Цитата:

Цитата DJ Mogarych
|? psiscontainer »

Цитата:

Цитата Adamm
в названиях файла присутствуют символы »


Adamm 15-08-2023 14:35 3013970

DJ Mogarych, все работает но в консоли красным отвечает:

Код:

Rename-Item : Исходный и результирующий путь должны различаться.
строка:31 знак:5
+    Rename-Item $folder.FullName $newname
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (C:\Users\Rychko...fdsfds\11-104-J:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

Rename-Item : Не удается выполнить переименование, так как элемент в "C:\Users\RychkovEA\Desktop\dsfdsfds\11-101-E\4124
-CD-VD-DT" не существует.
строка:31 знак:5
+    Rename-Item $folder.FullName $newname


DJ Mogarych 15-08-2023 14:53 3013973

Цитата:

Цитата Adamm
Исходный и результирующий путь должны различаться »

Значит, нечего переименовывать, с именем всё в порядке.

Скопируйте скрипт ещё раз, там добавилось
Код:

-ErrorAction SilentlyContinue
YuS_2, а как у вас в хэш-таблице сосуществуют
Код:

[char]'А' = 'A'
[char]'а' = 'a'

?
По умолчанию вроде бы так не работает, надо явно указывать тип.

YuS_2 15-08-2023 15:07 3013975

Цитата:

Цитата DJ Mogarych
как у вас в хэш-таблице сосуществуют »

Код:

@{[char]'А'=1;[char]'а'=2}
[char]'A' - это совсем не то же самое, что и 'A'
во втором случае, это [string]

Adamm 15-08-2023 15:15 3013976

Спасибо огромное! Все работает!

Uragan66 15-08-2023 15:17 3013977

С функцией полной транслитерации. Может пригодится.

Код:

    function Translit ([string]$inString)
    {
        #Создаём хеш-таблицу соответствия символов
        $Translit = @{
        [char]'а' = "a"
        [char]'А' = "A"
        [char]'б' = "b"
        [char]'Б' = "B"
        [char]'в' = "v"
        [char]'В' = "V"
        [char]'г' = "g"
        [char]'Г' = "G"
        [char]'д' = "d"
        [char]'Д' = "D"
        [char]'е' = "e"
        [char]'Е' = "E"
        [char]'ё' = "yo"
        [char]'Ё' = "Yo"
        [char]'ж' = "zh"
        [char]'Ж' = "Zh"
        [char]'з' = "z"
        [char]'З' = "Z"
        [char]'и' = "i"
        [char]'И' = "I"
        [char]'й' = "j"
        [char]'Й' = "J"
        [char]'к' = "k"
        [char]'К' = "K"
        [char]'л' = "l"
        [char]'Л' = "L"
        [char]'м' = "m"
        [char]'М' = "M"
        [char]'н' = "n"
        [char]'Н' = "N"
        [char]'о' = "o"
        [char]'О' = "O"
        [char]'п' = "p"
        [char]'П' = "P"
        [char]'р' = "r"
        [char]'Р' = "R"
        [char]'с' = "s"
        [char]'С' = "S"
        [char]'т' = "t"
        [char]'Т' = "T"
        [char]'у' = "u"
        [char]'У' = "U"
        [char]'ф' = "f"
        [char]'Ф' = "F"
        [char]'х' = "h"
        [char]'Х' = "H"
        [char]'ц' = "c"
        [char]'Ц' = "C"
        [char]'ч' = "ch"
        [char]'Ч' = "Ch"
        [char]'ш' = "sh"
        [char]'Ш' = "Sh"
        [char]'щ' = "sch"
        [char]'Щ' = "Sch"
        [char]'ъ' = ""
        [char]'Ъ' = ""
        [char]'ы' = "y"
        [char]'Ы' = "Y"
        [char]'ь' = ""
        [char]'Ь' = ""
        [char]'э' = "e"
        [char]'Э' = "E"
        [char]'ю' = "yu"
        [char]'Ю' = "Yu"
        [char]'я' = "ya"
        [char]'Я' = "Ya"
        }
        [string]$inString = $_.Name
        $TranslitText =""
        foreach ($CHR in $inCHR = $inString.ToCharArray())
            {
            if ($Translit[$CHR] -cne $Null)
                { $TranslitText += $Translit[$CHR] }
            else
                { $TranslitText += $CHR }
            }
        return $TranslitText
    }

$folder = '.\Test'

Get-ChildItem -Path $folder -Directory | Rename-Item -NewName {Translit} -ErrorAction SilentlyContinue


YuS_2 15-08-2023 18:21 3013983

Цитата:

Цитата Uragan66
функцией полной транслитерации »

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

# .\script.ps1 'АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ - абвгдеёжзиклмнопрстуфхцчшщъыьэюя'
# .\script.ps1 'ABVGDEYOZHZIKLMNOPRSTUFXCCHSHSHH``Y``E`YUYA - abvgdeyozhziklmnoprstufxcchshshh``y``e`yuya' -rev
# ГОСТ 7.79-2000 тип Б ( https://ru.wikipedia.org/wiki/ISO_9 , http://docs.cntd.ru/document/1200026226 )
# Скрипт оптимизирован 24.04.20г. на предмет скорости выполнения. Заменен способ формирования основного массива,
# теперь используется system.text.stringbuilder

[cmdletbinding()]
param(
        [parameter(mandatory=$true,valuefrompipeline=$true)]
        [allowemptystring()]
        [allownull()]
        [string[]]$string,
        [switch]$reverse
)

function translit {
        param(
                [parameter(mandatory=$true,valuefrompipeline=$true)]
                [allowemptystring()]
                [allownull()]
                [string]$fstring
        )
        begin {
                $arr1 = @(
                        '8979','89111','121111','9072','90104','122104','6790','67122','99122','6772',
                        '67104','99104','8372','83104','115104','837272','83104104','115104104','9696','8996',
                        '12196','6996','10196','8985','89117','121117','8965','8997','12197'
                )
                $charr = @{
                        [char]'А' = 'A'
                        [char]'а' = 'a'
                        [char]'Б' = 'B'
                        [char]'б' = 'b'
                        [char]'В' = 'V'
                        [char]'в' = 'v'
                        [char]'Г' = 'G'
                        [char]'г' = 'g'
                        [char]'Д' = 'D'
                        [char]'д' = 'd'
                        [char]'Е' = 'E'
                        [char]'е' = 'e'
                        [char]'Ё' = 'YO'
                        [char]'ё' = 'yo'
                        [char]'Ж' = 'ZH'
                        [char]'ж' = 'zh'
                        [char]'З' = 'Z'
                        [char]'з' = 'z'
                        [char]'И' = 'I'
                        [char]'и' = 'i'
                        [char]'Й' = 'J'
                        [char]'й' = 'j'
                        [char]'К' = 'K'
                        [char]'к' = 'k'
                        [char]'Л' = 'L'
                        [char]'л' = 'l'
                        [char]'М' = 'M'
                        [char]'м' = 'm'
                        [char]'Н' = 'N'
                        [char]'н' = 'n'
                        [char]'О' = 'O'
                        [char]'о' = 'o'
                        [char]'П' = 'P'
                        [char]'п' = 'p'
                        [char]'Р' = 'R'
                        [char]'р' = 'r'
                        [char]'С' = 'S'
                        [char]'с' = 's'
                        [char]'Т' = 'T'
                        [char]'т' = 't'
                        [char]'У' = 'U'
                        [char]'у' = 'u'
                        [char]'Ф' = 'F'
                        [char]'ф' = 'f'
                        [char]'Х' = 'X'
                        [char]'х' = 'x'
                        [char]'Ц' = 'C'
                        [char]'ц' = 'c'
                        [char]'Ч' = 'CH'
                        [char]'ч' = 'ch'
                        [char]'Ш' = 'SH'
                        [char]'ш' = 'sh'
                        [char]'Щ' = 'SHH'
                        [char]'щ' = 'shh'
                        [char]'Ъ' = '``'
                        [char]'ъ' = '``'
                        [char]'Ы' = 'Y`'
                        [char]'ы' = 'y`'
                        [char]'Ь' = '`'
                        [char]'ь' = '`'
                        [char]'Э' = 'E`'
                        [char]'э' = 'e`'
                        [char]'Ю' = 'YU'
                        [char]'ю' = 'yu'
                        [char]'Я' = 'YA'
                        [char]'я' = 'ya'
                }
                $revcharr = @{
                        [char]'A' = 'А'
                        [char]'a' = 'а'
                        [char]'B' = 'Б'
                        [char]'b' = 'б'
                        [char]'V' = 'В'
                        [char]'v' = 'в'
                        [char]'G' = 'Г'
                        [char]'g' = 'г'
                        [char]'D' = 'Д'
                        [char]'d' = 'д'
                        [char]'E' = 'Е'
                        [char]'e' = 'е'
                        $(-join [int[]][char[]]'YO') = 'Ё' <#89-79#>
                        $(-join [int[]][char[]]'Yo') = 'Ё' <#89-111#>
                        $(-join [int[]][char[]]'yo') = 'ё' <#121-111#>
                        $(-join [int[]][char[]]'ZH') = 'Ж' <#90-72#>
                        $(-join [int[]][char[]]'Zh') = 'Ж' <#90-104#>
                        $(-join [int[]][char[]]'zh') = 'ж' <#122-104#>
                        [char]'Z' = 'З'
                        [char]'z' = 'з'
                        [char]'I' = 'И'
                        [char]'i' = 'и'
                        [char]'J' = 'Й'
                        [char]'j' = 'й'
                        [char]'K' = 'К'
                        [char]'k' = 'к'
                        [char]'L' = 'Л'
                        [char]'l' = 'л'
                        [char]'M' = 'М'
                        [char]'m' = 'м'
                        [char]'N' = 'Н'
                        [char]'n' = 'н'
                        [char]'O' = 'О'
                        [char]'o' = 'о'
                        [char]'P' = 'П'
                        [char]'p' = 'п'
                        [char]'R' = 'Р'
                        [char]'r' = 'р'
                        [char]'S' = 'С'
                        [char]'s' = 'с'
                        [char]'T' = 'Т'
                        [char]'t' = 'т'
                        [char]'U' = 'У'
                        [char]'u' = 'у'
                        [char]'F' = 'Ф'
                        [char]'f' = 'ф'
                        [char]'X' = 'Х'
                        [char]'x' = 'х'
                        [char]'C' = 'Ц'
                        $(-join [int[]][char[]]'CZ')        = 'Ц' <#67-90#>
                        $(-join [int[]][char[]]'Cz')        = 'Ц' <#67-122#>
                        [char]'c' = 'ц'
                        $(-join [int[]][char[]]'cz')        = 'ц' <#99-122#>
                        $(-join [int[]][char[]]'CH')        = 'Ч' <#67-72#>
                        $(-join [int[]][char[]]'Ch')        = 'Ч' <#67-104#>
                        $(-join [int[]][char[]]'ch')        = 'ч' <#99-104#>
                        $(-join [int[]][char[]]'SH')        = 'Ш' <#83-72#>
                        $(-join [int[]][char[]]'Sh')        = 'Ш' <#83-104#>
                        $(-join [int[]][char[]]'sh')        = 'ш' <#115-104#>
                        $(-join [int[]][char[]]'SHH')        = 'Щ' <#83-72-72#>
                        $(-join [int[]][char[]]'Shh')        = 'Щ' <#83-104-104#>
                        $(-join [int[]][char[]]'shh')        = 'щ' <#115-104-104#>
                        #[char]''    = 'Ъ'
                        $(-join [int[]][char[]]'``')        = 'ъ' <#96-96#>
                        $(-join [int[]][char[]]'Y`')        = 'Ы' <#89-96#>
                        $(-join [int[]][char[]]'y`')        = 'ы' <#121-96#>
                        #[char]'`'    = 'Ь'
                        [char]'`'    = 'ь'
                        $(-join [int[]][char[]]'E`')        = 'Э' <#69-96#>
                        $(-join [int[]][char[]]'e`')        = 'э' <#101-96#>
                        $(-join [int[]][char[]]'YU')        = 'Ю' <#89-85#>
                        $(-join [int[]][char[]]'Yu')        = 'Ю' <#89-117#>
                        $(-join [int[]][char[]]'yu')        = 'ю' <#121-117#>
                        $(-join [int[]][char[]]'YA')        = 'Я' <#89-65#>
                        $(-join [int[]][char[]]'Ya')        = 'Я' <#89-97#>
                        $(-join [int[]][char[]]'ya')        = 'я' <#121-97#>
                }
        }
        process {
                $arr = new-object system.text.stringbuilder
                if($reverse){
                        $f2,$f3,$j,$m = $true,$true,0,0
                        $cnt = $fstring.tochararray().length
                        $arrtmp = $fstring.tochararray()
                        for($i=0;$i -lt $cnt;$i++){
                                if ($f2 -and $f3 -and $arr1 -match "^$([int][char]$arrtmp[$i])") {
                                        if (($i+2) -lt $cnt){
                                                for ($k=0;$k -le 2;$k++){
                                                        [string]$str += "$([int][char]$arrtmp[($i+$k)])"
                                                }
                                                if ($arr1 -contains $str){$f3 = $false}
                                                $str = $null
                                        }
                                        if (($i+1) -lt $cnt -and $f3){
                                                for ($l=0;$l -le 1;$l++){
                                                        [string]$str += "$([int][char]$arrtmp[($i+$l)])"
                                                }
                                                if ($arr1 -contains $str){$f2 = $false}
                                                $str = $null
                                        }
                                }
                                if (!$f3){
                                        [string]$str += "$([int][char]$arrtmp[$i])";$j++
                                        if ($j -ge 3){
                                                $f3 = $true;$j = 0
                                                $null = $arr.append($revcharr[$str])
                                                $str = $null
                                        }
                                } elseif (!$f2){
                                        [string]$str += "$([int][char]$arrtmp[$i])";$m++
                                        if ($m -ge 2){
                                                $f2 = $true;$m = 0
                                                $null = $arr.append($revcharr[$str])
                                                $str = $null
                                        }
                                } else {
                                        if ($revcharr[$arrtmp[$i]] -cne $null){
                                                $null = $arr.append($revcharr[$arrtmp[$i]])
                                        } else {
                                                $null = $arr.append($arrtmp[$i])
                                        }
                                }
                        }
                        $null = $arr.append("`n")
                } else {
                        foreach ($item in $fstring.tochararray()){
                                if ($charr[$item] -cne $null){
                                        $null = $arr.append($charr[$item])
                                } else {
                                        $null = $arr.append($item)
                                }
                        }
                        $null = $arr.append("`n")
                }
        }
        end {$arr.tostring().trim("`n")}
}

$string|translit



Время: 23:57.

Время: 23:57.
© OSzone.net 2001-