Powershell Переместить файлы в определенную папку - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно переместить файлы, которые удовлетворяют определенным условиям, из папки A в определенную подпапку в папке B.

Условия:

  • Группировать файлыкоторые содержат .exe и принимают два с наибольшим числом.

  • После числа взять строку между первыми двумя дефисными символами (-).Пользовательская строка

  • Переместите эти файлы в папку B \ win (пользовательская строка), если папка win не существует, создайте ее, то же самое относится и к папке пользовательской строки.

Так, например, на изображении ниже мы бы взяли файлы CICone NT Setup 0.25.5-develop-build.0.exe и CICone NT Setup 0.25.5-develop-build.0.exe.blockmap и переместили их в папку B\win\develop\, здесь развитие - это имя папки(строка между двумя первыми символами дефиса).enter image description here


Вот решение:

$winFiles = get-childitem | Where-Object {$_.Name -like "*.exe*"} | Sort-Object -Descending -Property Name | Select-Object -First 2

ForEach ($file in $winFiles){ 
$EnvironmentSubstring = $file.Name.Split('-')[1]

if(!(Test-Path ..\B\win)){

    New-Item -Path ..\B\win -ItemType Directory -Force | Out-Null

    if(!(Test-Path ..\B\win\$EnvironmentSubstring)){
    New-Item -Path ..\B\win\$EnvironmentSubstring -ItemType Directory -Force | Out-Null
    }
}

Move-Item -Path $file.Name -Destination ..\B\win\$EnvironmentSubstring\ -Force
}

1 Ответ

0 голосов
/ 25 апреля 2018

Я смоделировал каталог с этими файлами:

Mode                LastWriteTime         Length Name                                             
----                -------------         ------ ----                                             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.5-dev-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.4-UAT-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.3-UAT-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.3-dev-build.exe             

Ваш первый запрос нашел два файла .exe с наибольшим номером по этому пути, это просто.

>get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

Mode                LastWriteTime         Length Name                                             
----                -------------         ------ ----                                             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.5-dev-build.exe             
-a----        4/25/2018  11:07 AM              3 CICone NT Setup 0.25.4-UAT-build.exe    

Следующий шаг - сохранить этот список файлов в переменной с именем $files следующим образом.

>$files = get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

Теперь, чтобы пройтись по ним и разобрать окружение.

PowerShell - это объектно-ориентированный язык сценариев, который позволяет нам выбирать свойства объектов (в данном случае свойство .Name каждого файла) и затем воздействовать на эти свойства, вызывая методы для них. Мы можем использовать метод .Split(), чтобы разбить строку на каждый экземпляр символа. Например, если мы хотим разделить наши файлы на символе -, мы можем сделать это следующим образом:

>$file.Name.Split('-')
CICone NT Setup 0.25.4
dev
build.exe

Затем мы можем выбрать второй в списке, используя индексную нотацию, как показано ниже (0 = первая позиция, 1 = вторая позиция и т. Д.)

>$file.Name.Split('-')[1]
dev

Объединение всех этих концепций в сценарий для начала работы:

$files = get-childitem *.exe | Sort-Object -Descending -Property Name | Select-Object -First 2

ForEach ($file in $files){ 
    $EnvironmentSubstring = $file.Name.Split('-')[1]
    "this file $($file.Name) should go to .\$EnvironmentSubstring\"
}

Запуск, который даст следующий вывод:

this file CICone NT Setup 0.25.5-dev-build.exe should go to .\dev\
this file CICone NT Setup 0.25.4-UAT-build.exe should go to .\UAT\

Здесь вам просто нужно выяснить, какую команду использовать для копирования файла. PowerShell использует соглашение об именовании Verb-Noun, поэтому я дам вам подсказку, что вам нужно научиться использовать Copy-Item. Вы можете запустить Get-Help Copy-Item -Examples, чтобы увидеть подробные примеры использования каждого командлета в PowerShell, запустив его из приглашения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...