сообщение powershell зависит от совпадения нескольких массивов - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь разработать скрипт для перемещения (некоторых) файлов, поступающих в каталог, и регистрации результатов. У меня есть право на копирование (я говорю правильно - это работает - но на самом деле это может быть безнадежно неправильно!), Но не ведение журнала.

Вот командная строка:

PCopy.ps1 - ECM несущей - направление IN - фильтр DEL, MAN

Первый параметр правильно определяет каталоги, второй выбирает подкаталог. Третий параметр - то, где это становится интересным, поскольку это массив.

Итак, я придумал пару вложенных циклов:

Foreach($item in $filter){
    foreach($File in $filenames){
        If($File -match $Item){ 
    Write-Log "$File matches filter" -Path $LogFile
    Copy-Item -Path $Sourcefile\$direction\$File -Destination $Destination 

Это хорошо. Но поскольку он проходит через каждый фильтр, а файл, файл, который соответствует одному фильтру, не обязательно соответствует следующему.

Я пытаюсь скопировать нужные мне файлы и регистрировать только те файлы, которые мне не нужны.

Итак, скажем, 3 файла прибывают

Man.txt
Del.txt
Ava.txt

Я хочу, чтобы файл журнала показывал, что первые два соответствуют фильтру, и копировал их в место назначения, но третий не соответствует ни одному фильтру, поэтому регистрируется и не копируется.

Я знаю, что так, как я написал, так как каждый файл сравнивается с фильтром - я получу 2 скопированных сообщения и 4 несоответствующих сообщения - это не то, что я хочу.

Мне нужен более элегантный способ, что-то вроде:

Man.txt matches the filter MAN and was copied to $destination
Del.txt matches the filter DEL and was copied to $destination
Ava.txt did not match any filter so is being logged only

Единственное, о чем я подумал, это попытаться построить массив ответов и проверить (и удалить) дубликаты - но это не кажется очень интуитивным - может кто-нибудь помочь?

Я новичок в Powershell - так что прости меня, если я пропустил очевидное кровотечение!

1 Ответ

0 голосов
/ 07 ноября 2018

вы можете использовать регулярное выражение ИЛИ, чтобы проверить «это ИЛИ» с помощью «|» условное обозначение. как то так ...

$Filter = 'One', 'Two'
$RegexFilter = $Filter -join '|'

'This contains One, but not the other filter item.' -match $RegexFilter
'One and Two are here.' -match $RegexFilter
'This line has only Two.' -match $RegexFilter
'No matching items are in this line.' -match $RegexFilter

вывод ...

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