none
Задача (скрипт) из книги RRS feed

  • Вопрос

  • Добрый день. Читаю замечательную книгу: "Windows PowerShell". Книга короткая(всего 44 страницы), но зато содержит в себе ряд задач на написание скриптов. Есть одна задачка, с которой справиться не могу. Имеется каталог, содержащий файлы разных типов(текст\картинки\видео и т.д.). Надо написать скрипт, который создавал бы для каждого типа файлов каталог, используя в качестве имени каталога, тип файла, а потом переносил в этот каталог все файлы такого типа. С первой частью я справился без проблем:

    Строка: Get-ChildItem | Sort-Object Extension -Unique | foreach { New-Item $_.Extension -type Directory } создала папки для каждого типа файлов.

    Но написать скрипт, который бы раскидывал файлы по папкам никак не получается =(. 

    Буду признателен за любую помощь.

    14 апреля 2010 г. 10:00

Ответы

  • на вскидку как-то так:

    $path2dir="c:\bla-bla-bla"
    cd $path2dir
    dir $path2dir -recurce| %{
     
      if (!$_.PSIsContainer) {
       try { 
        copy $_ $path2dir\$_.Extension
       }
       catch {
        trap {continue}
        md $path2dir\$_.Extension
        copy $_ $path2dir\$_.Extension\$_
        trap {break}
       }
      }
    }
    Upd пошиксил ошибку - добавил проверку на то, что текущий объект есть файл, а не папка
    • Помечено в качестве ответа Oleh Tserkovnyuk 15 апреля 2010 г. 6:25
    14 апреля 2010 г. 11:46
  • ЕМНИП в этой книжке были приведены решения дальше :)

    Я бы написал так:

    dir | foreach {$_ -replace '^.+\.'} | select -Unique | foreach {md $_; mv "*.$_" $_}

    Но по-моему там было проще.

    Вообще это совсем не книга для самостоятельного обучения, а скорее вводный курс, для занятий с преподавателем. Так что присоединюсь к совету s.h.s.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Oleh Tserkovnyuk 15 апреля 2010 г. 6:25
    15 апреля 2010 г. 3:56
    Модератор

Все ответы

  • на вскидку как-то так:

    $path2dir="c:\bla-bla-bla"
    cd $path2dir
    dir $path2dir -recurce| %{
     
      if (!$_.PSIsContainer) {
       try { 
        copy $_ $path2dir\$_.Extension
       }
       catch {
        trap {continue}
        md $path2dir\$_.Extension
        copy $_ $path2dir\$_.Extension\$_
        trap {break}
       }
      }
    }
    Upd пошиксил ошибку - добавил проверку на то, что текущий объект есть файл, а не папка
    • Помечено в качестве ответа Oleh Tserkovnyuk 15 апреля 2010 г. 6:25
    14 апреля 2010 г. 11:46
  • Спасибо за ответ. Не странно, что у меня это не вышло, в книге таких вещей просто нет(в частности нет команды try). Или они предпологали другое решение, или предпологали, что я это должен знать. У меня к Вам пару вопросов:

    dir $path2dir -recurce| %   - что делает знак:  %

    !$_.PSIsContainer - это строка, как я понял работает со свойством текущего объекта конвеера, на что влияет знак: !

     

    14 апреля 2010 г. 12:49
  • > на что влияет знак: !

    см. здесь : help about_Logical_Operators

     

    > dir $path2dir -recurce| %   - что делает знак:  %

    get-command %

    help % -full

     

    PS Судя по всему, 44 страницы малова-то для нормального описания PoSh. Лучше возмитесь за "Windows PowerShell in Action", в ней 551 страница ;)

    14 апреля 2010 г. 17:27
  • > на что влияет знак: !

    см. здесь : help about_Logical_Operators

     

    > dir $path2dir -recurce| %   - что делает знак:  %

    get-command %

    help % -full

     

    PS Судя по всему, 44 страницы маловато для нормального описания PoSh. Лучше возмитесь за "Windows PowerShell in Action", в ней 551 страница ;)

    14 апреля 2010 г. 17:32
  • ЕМНИП в этой книжке были приведены решения дальше :)

    Я бы написал так:

    dir | foreach {$_ -replace '^.+\.'} | select -Unique | foreach {md $_; mv "*.$_" $_}

    Но по-моему там было проще.

    Вообще это совсем не книга для самостоятельного обучения, а скорее вводный курс, для занятий с преподавателем. Так что присоединюсь к совету s.h.s.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа Oleh Tserkovnyuk 15 апреля 2010 г. 6:25
    15 апреля 2010 г. 3:56
    Модератор
  • > dir | foreach {$_ -replace '^.+\.'}|...

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

    В задании же говорится: "который создавал бы для каждого типа файлов каталог", посему скрипт должен иметь еще одно условие-фильтр, отбирающее только файлы ;)

    15 апреля 2010 г. 6:02
  • > dir | foreach {$_ -replace '^.+\.'}|...

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

    В задании же говорится: "который создавал бы для каждого типа файлов каталог", посему скрипт должен иметь еще одно условие-фильтр, отбирающее только файлы ;)

    15 апреля 2010 г. 6:02
  • Спасибо за ответы.

    Книгу обязательно закажу, спасибо за подсказку.

    Насчёт ответов: действительно есть, я их как-то пропустил, когда книгу пролистывал =( .

    Ответ из книги: get-childitem | where-object {$_.mode -notmatch "d"} |
    foreach-object {$b= ".\New" + $_.extension; move-item $_.fullname $b}

    15 апреля 2010 г. 6:24