powershell Вставить текст между циклом foreach - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужно получить -and между каждым результатом цикла foreach, чтобы создать массив.Это означает, что у меня не может быть его в конце массива!

Мой скрипт выглядит так:

Param (
[Parameter(Mandatory=$false)]
[string]$IncludeFilesCSVPath = "\\mypath\IncludeFiles.csv"
)

$includeFilesCsv = Import-CSV $IncludeFilesCSVPath


$includeFilesList = New-Object -TypeName "System.Collections.Generic.List[string]"
foreach ($item in $includeFilesCsv) {
    $includeFilesList.Add('(-not (Attachment -like "*' + $item.Godkjent + '"))')
}
$includeFiles = $includeFilesList.ToArray()

Write-Host $IncludeFiles

Файл CSV имеет заголовки: Godkjent И каждая строка содержит файлокончания, такие как .EXE .TXT .PS1

Выходные данные сейчас:

(-not (Attachment -like "*.DOC")) (-not (Attachment -like "*.DOCX")) (-not (Attachment -like "*.TXT")) (-not (Attachment -like "*.CSV"))

Но мне нужно:

(-not (Attachment -like "*.DOC")) -and (-not (Attachment -like "*.DOCX")) -and (-not (Attachment -like "*.TXT")) -and (-not (Attachment -like "*.CSV"))

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Попробуйте этот код:

Param (
[Parameter(Mandatory=$false)]
[string]$IncludeFilesCSVPath = "\\mypath\IncludeFiles.csv"
)

$includeFilesCsv = Import-CSV $IncludeFilesCSVPath

$Total = $includeFilesCsv.count
$counter = 0
$includeFilesList = New-Object -TypeName "System.Collections.Generic.List[string]"

foreach ($item in $includeFilesCsv) {

    $counter++

    if ($counter -ne $Total) {
        $includeFilesList.Add('(-not (Attachment -like "*' + $item.Godkjent + '")) -and')
    } 
    else {
        $includeFilesList.Add('(-not (Attachment -like "*' + $item.Godkjent + '"))')
    }

}

$includeFiles = $includeFilesList.ToArray()

Write-Host $IncludeFiles

Вот так выглядит мой CSV-файл:

enter image description here

Это мой вывод изскрипт выше: enter image description here

Дайте мне знать, если это не сработает.Я попробую еще раз.

0 голосов
/ 02 декабря 2018
  • Вам не нужно собирать вывод foreach элемента явно в список - используя оператор в целом как выражение неявно возвращаетвыходные данные в виде массива .

  • Чтобы объединить элементы массива вместе с разделителем для формирования одной строки, используйте оператор -join.

$includeFiles = $(foreach ($item in $includeFilesCsv) {
  '(-not (Attachment -like "*' + $item.Godkjent + '"))'
}) -join ' -and '

Обратите внимание на необходимость $(...) вокруг цикла foreach, чтобы сделать его частью более крупного выражения.(@(...), чтобы гарантировать массив, также работал бы здесь, но это не имеет никакой эффективной разницы).

Возможно, удивительная потребность в $(...), а не просто (...) обсуждается в этой проблеме GitHub .

...