none
Нужна помощь в редактировании скрипта для переименования файлов RRS feed

  • Вопрос

  • День добрый!

    Помогите пожалуйста с редактированием PS скрипта. Нашел код, который в текущей папке ищет файлы по заданной маске и рандомно их переименовывает. Проблема возникла с тем, что мне нужна возможность указать путь до папки, в которой необходимо произвести изменения, а скрипт обрбабатывает только папки по пути C:\Users\%username%

    Сам код:

    #Получение всех элементов в текущей папке
    $dir = Get-ChildItem
    foreach ($d in $dir) {
        #Проверка, является ли объект папкой
        if ($d.Attributes -eq "Directory")
            {
                $count = 0
                #Переходим в подпапку
                cd $d
                <#Получаем список файлов с указанным расширением и удовлетворяющим рег.выражению "Внутри названия есть хоть 1 цифра" #>
                Get-ChildItem *.mp4 | Where-Object {$_.Name -match "[A-z0-9]*\.mp4"} | ForEach-Object{Rename-Item $_ -NewName "$(Get-Random).mp4"; $count++}
                            #Выход из подпапки
                cd ..
                echo "Папка '$d' проработана! ($count изменено)"
                $count = 0
            }
           
    }
    echo "Автозакрытие через 2 секунды"
    #И действительно выходим через 2 секунды!
    Start-Sleep -s 2

    23 октября 2015 г. 10:23

Ответы

Все ответы

  • $dir = Get-ChildItem заменить на:

    param($folder)
    $dir = Get-ChildItem $folder

    Вызова скрипта:

    C:\Scripts\ren.ps1 -Folder C:\Music

    • Предложено в качестве ответа Vector BCOModerator 23 октября 2015 г. 10:32
    23 октября 2015 г. 10:30
    Отвечающий
  • В скрипте неправильно описано регулярное выражение

    <#Получаем список файлов с указанным расширением и удовлетворяющим рег.выражению "Внутри названия есть хоть 1 цифра" #>
                Get-ChildItem *.mp4 | Where-Object {$_.Name -match "[A-z0-9]*\.mp4"} | ForEach-Object{Rename-Item $_ -NewName "$(Get-Random).mp4"; $count++}

    Регулярное выражение вернет TRUE для любого файла без спец. симфолов

    Например

    "asdf.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    "123.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    "123asdf.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    ".mp4" -match "[A-z0-9]*\.mp4" - TRUE

    Хоть это и не относилось к вашему вопросу, я решил уточнить :)

    Простите за офтоп


    The opinion expressed by me is not an official position of Microsoft


    23 октября 2015 г. 10:40
    Модератор
  • $dir = Get-ChildItem заменить на:

    param($folder)
    $dir = Get-ChildItem $folder

    Вызова скрипта:

    C:\Scripts\ren.ps1 -Folder C:\Music

    Спасибо! А если без доп. параметров, путь указать в самом теле скрипта? Просто хочу поставить скрипт в планировщик на нескольких ПК, и удобнее будет вносить изменения в сам код, чем править параметры в планировщике.
    23 октября 2015 г. 10:48
  • $dir = Get-ChildItem "МОЙ ПУТЬ"
    • Помечено в качестве ответа Vector BCOModerator 23 октября 2015 г. 12:19
    23 октября 2015 г. 10:50
    Отвечающий
  • В скрипте неправильно описано регулярное выражение

    <#Получаем список файлов с указанным расширением и удовлетворяющим рег.выражению "Внутри названия есть хоть 1 цифра" #>
                Get-ChildItem *.mp4 | Where-Object {$_.Name -match "[A-z0-9]*\.mp4"} | ForEach-Object{Rename-Item $_ -NewName "$(Get-Random).mp4"; $count++}

    Регулярное выражение вернет TRUE для любого файла без спец. симфолов

    Например

    "asdf.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    "123.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    "123asdf.mp4" -match "[A-z0-9]*\.mp4" - TRUE

    ".mp4" -match "[A-z0-9]*\.mp4" - TRUE

    Хоть это и не относилось к вашему вопросу, я решил уточнить :)

    Простите за офтоп


    The opinion expressed by me is not an official position of Microsoft


    Благодарю за комментарий. Код изначально был немного другой, я его правил без правки комментов.
    23 октября 2015 г. 10:50
  • $dir = Get-ChildItem "МОЙ ПУТЬ"

    Не работает у меня(

    Указываю путь С:\Test (внутри папки с временем 6-12, 12-16 итд)

    Скрипт выдает 

    Set-Location : Не удается найти путь "C:\22-6", так как он не существует.
    C:\Scripts\rename.ps1:10 знак:15
    +             cd <<<<  $d
        + CategoryInfo          : ObjectNotFound: (C:\22-6:String) [Set-Location], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

    Почему-то не видит полный путь C:\Test\22-6


    • Изменено Shishlav 23 октября 2015 г. 11:38
    23 октября 2015 г. 11:38
  • cd $d заменить на cd $d.FullName
    23 октября 2015 г. 11:43
    Отвечающий
  • cd $d заменить на cd $d.FullName
    Спасибо огромное! Все заработало как надо!
    23 октября 2015 г. 11:58
  • Это условие $d.Attributes -eq "Directory" будет возвращать false если папка имеет какой либо атрибут (только для чтения, скрытый, системный, архивный, сжатый, зашифрованный). Если Вы хотите проверить является ли объект папкой, то можно использовать такое условие: $d.PSIsContainer. А если Вам нужны только папки, то проще использовать: Get-ChildItem -Directory.
    23 октября 2015 г. 13:36