none
Распарсить имя файла по годам, сгруппировать, копировать сгруппированные файлы в папку. RRS feed

  • Вопрос

  • Добрый день. Помогите в написании скрипта.

    Большое кол-во архивов хранится в папке X:\Temp. Архив имеет маску имени файла YYYYmm.7z. Пример: 201507.7z (год,месяц).

    Условие для скрипта:

    1. Скрипт должен распарсить архивы\файлы по годам
    1. Сгруппировать по одинаковому году
    1. Переместить\копировать сгруппированные файлы по годам  в папку соответствующей папке YYYY(год), С:\Archive\YYYY
    2. Если в каталоге С:\Archive нет соответствующей папки YYYY, папка должна быть создана автоматически

    Спасибо


    28 июля 2015 г. 11:48

Ответы

  • Тогда приложить скрин с выполнением скрипта:

    Get-ChildItem X:\Temp\*.7z | Where {$date = 0;[DateTime]::TryParseExact($_.Name.SubString(0,6),"yyyyMM",[Globalization.CultureInfo]::Custom,"None",[ref]$date)} | Move-Item -Destination {
    	Write-Host ("C:\Archive\" + $_.Name.SubString(0,4)) -ForeGround Yellow
    	md ("C:\Archive\" + $_.Name.SubString(0,4)) -Force
    }

    • Помечено в качестве ответа KazunEditor 30 июля 2015 г. 9:21
    30 июля 2015 г. 7:50
    Отвечающий

Все ответы

  • Get-ChildItem X:\Temp\*.7z | Where {$date = 0;[DateTime]::TryParseExact($_.BaseName,"yyyyMM",[Globalization.CultureInfo]::Custom,"None",[ref]$date)} | Copy-Item -Destination {
    	md ("С:\Archive\" + $_.BaseName.SubString(0,4)) -Force
    }

    • Предложено в качестве ответа Vector BCOModerator 28 июля 2015 г. 12:43
    28 июля 2015 г. 12:03
    Отвечающий
  • Скрипт отработал, но без результата. Допустил ошибку в описании имени маски файла она имеет следующий вид YYYYmm_Folder.7z. Пример: 201507_Invoice.7z.

    Можете добавить удаление скопированных файлов из X:\Temp . Спасибо.

    • Изменено dny_sergei 28 июля 2015 г. 13:03
    28 июля 2015 г. 13:01
  • Get-ChildItem X:\Temp\*.7z | Where {$date = 0;[DateTime]::TryParseExact($_.Name.SubString(0,6),"yyyyMM",[Globalization.CultureInfo]::Custom,"None",[ref]$date)} | Copy-Item -Destination {
    	md ("С:\Archive\" + $_.Name.SubString(0,4)) -Force
    }

    28 июля 2015 г. 13:02
    Отвечающий
  • Ошибки при выполнении скрипта.

    Copy-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    C:\Archive\ps3part.ps1:2 знак:24
    + Copy-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201306_Temp1.7z:PSObject) [Copy-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.CopyItemCommand

    28 июля 2015 г. 13:26
  • Ошибка в указании пути "С:\Archive\" - проверить, что нет русских символов.
    28 июля 2015 г. 13:37
    Отвечающий
  • Русских символов нет, другие скрипты с этого каталога отрабатывают.
    28 июля 2015 г. 13:43
  • Русских символов нет, другие скрипты с этого каталога отрабатывают.

    Причем тут другие скрипты. Внутри этого скрипта указать  правильный путь,для теста можно заменить на "С:\Archive\" на "C:\123".

    28 июля 2015 г. 13:47
    Отвечающий
  • Заменил путь на С:\arch, пробовал другой путь. Но ошибка осталась.

    PS C:\arch> .\script-3.ps1
    Copy-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    C:\Arch\script-3.ps1:2 знак:24
    + Copy-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201306_Temp1.7z:PSObject) [Copy-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.CopyItemCommand

    Copy-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    C:\Arch\script-3.ps1:2 знак:24
    + Copy-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201404_Temp1.7z:PSObject) [Copy-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.CopyItemCommand

    Copy-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    C:\Arch\script-3.ps1:2 знак:24
    + Copy-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201507_Temp1.7z:PSObject) [Copy-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.CopyItemCommand

      
    29 июля 2015 г. 8:37
  • Еще раз в пути С:\arch - буква C русская, измените на C английскую.
    29 июля 2015 г. 8:48
    Отвечающий
  • С:\arch - буква C английская. Я даже каталог пробовал с:\11, ошибка таже. При переходе на папку использовал cd c:\arch. Если использовал русскую раскладку, то ошибка была в команде cd и выбила ошибку.
    • Изменено dny_sergei 29 июля 2015 г. 9:10
    29 июля 2015 г. 9:00
  • С:\arch - буква C английская. Я даже каталог пробовал с:\11, ошибка таже. При переходе на папку использовал cd c:\arch. Если использовал русскую раскладку, то ошибка была в команде cd и выбила ошибку.
    Проблема в пути именования, укажите диск D: , где нельзя ошибиться.
    29 июля 2015 г. 9:13
    Отвечающий
  • Указал другой путь с диском, не помогло. Ошибка осталось прежняя. Какие еще варианты с чем это может быть связано?

    Move-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    N:\script-3.ps1:2 знак:24
    + Move-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201306_Temp1.7z:PSObject) [Move-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.MoveItemCommand
     
    Move-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    N:\script-3.ps1:2 знак:24
    + Move-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201404_Temp1.7z:PSObject) [Move-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.MoveItemCommand
     
    Move-Item : Не удается вычислить параметр "Destination", так как входные данные его аргумента не выдают никаких выходных данных.
    N:\script-3.ps1:2 знак:24
    + Move-Item -Destination {
    +                        ~
        + CategoryInfo          : InvalidArgument: (X:\Temp\201507_Temp1.7z:PSObject) [Move-Item], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoOutput,Microsoft.PowerShell.Commands.MoveItemCommand
    30 июля 2015 г. 7:31
  • Тогда приложить скрин с выполнением скрипта:

    Get-ChildItem X:\Temp\*.7z | Where {$date = 0;[DateTime]::TryParseExact($_.Name.SubString(0,6),"yyyyMM",[Globalization.CultureInfo]::Custom,"None",[ref]$date)} | Move-Item -Destination {
    	Write-Host ("C:\Archive\" + $_.Name.SubString(0,4)) -ForeGround Yellow
    	md ("C:\Archive\" + $_.Name.SubString(0,4)) -Force
    }

    • Помечено в качестве ответа KazunEditor 30 июля 2015 г. 9:21
    30 июля 2015 г. 7:50
    Отвечающий
  • Спасибо, скрипт отработал без ошибок. Как я вижу вы в первом скрипте забыли добавить Write-Host командлет.
    30 июля 2015 г. 8:26
  • Спасибо, скрипт отработал без ошибок. Как я вижу вы в первом скрипте забыли добавить Write-Host командлет.
    Нет, Write-Host просто выводит на экран данные и ничего более. Просто правильно скопировать, увы , Вы не смогли с первого раза.

    • Изменено KazunEditor 30 июля 2015 г. 8:57
    30 июля 2015 г. 8:56
    Отвечающий