Присоединение возвращаемого значения функции к строковой переменной в Powershell - PullRequest
1 голос
/ 14 февраля 2020

Предполагая следующий скрипт Powershell ...

function Process-Folder {
    [cmdletbinding()]
    param ([string]$Path)
    Process {
        $returnvalue = ""
        # code here that reads all of the .txt files in $path
        # and concatenates their contents to $returnvalue
    return $returnvalue
    }
}

Я хотел бы добавить строки в этот скрипт, которые вызывают эту функцию пару раз для обработки нескольких папок. Я написал бы этот код следующим образом:

$allFileContent = ""
$firstFolder = Process-Folder -Path "c:\foo"
$allFileContent = $allFileContent + $firstFolder

$secondFolder = Process-Folder -Path "c:\bar"
$allFileContent = $allFileContent + $secondFolder

Этот код работает, но кажется не элегантным и не похож на «способ Powershell». Я попытался:

$filecontent = ""
$filecontent = $filecontent + Process-Folder -Path "C:\foo"
$filecontent = $filecontent + Process-Folder -Path "C:\bar"

Но ISE дал мне "неожиданный токен" Папка процесса "в выражении или утверждении. Я также попытался:

$filecontent = ""
$filecontent | Process-Folder -Path "C:\foo"
$filecontent | Process-Folder -Path "C:\bar"

Который возвратил ...

The input object cannot be bound to any parameters for the command either because the 
command does not take pipeline input or the input and its properties do not match any 
of the parameters that take pipeline input.

Как я могу выполнить sh, что делает первый фрагмент более элегантным / "подобным Powershell" способом?

1 Ответ

1 голос
/ 15 февраля 2020

Похоже, вам нужно ставить скобки вокруг команд, чтобы они выполнялись первыми. Также не забывайте, что $x += 'a' - это то же самое, что и $x = $x + 'a', и вы можете назначить первое значение и добавить второе, не назначая сначала пустую строку, поэтому попробуйте следующее:

$filecontent = Process-Folder -Path "C:\foo"
$filecontent += Process-Folder -Path "C:\bar"

РЕДАКТИРОВАТЬ: я понял, после того как я закончил переписывать код, что я поместил его в форму, где вам больше не нужны парены, поэтому я удалил их. Но выполнение этого полностью потеряло пример, который я использовал, чтобы показать вам, как исправить строки, которые были проблемой для вас раньше (да).

Так что ... нужны скобки при объединении некоторых данных с результатом функции. Вы должны заставить функцию запускаться первой. Таким образом, в исходном формате вам понадобятся следующие символы:

$filecontent = ""
$filecontent = $filecontent + (Process-Folder -Path "C:\foo")
$filecontent + $filecontent + (Process-Folder -Path "C:\bar")

Вы можете прочитать все об этом в этой статье

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

Надеюсь, это поможет!

...