Передать многострочную строку как параметр сценария в Powershell

Установка

В написанном мной сценарии powershell я использую многострочную строку, например:

$MLINE_VARIABLE = "*file1
  - change1
  - change2
*file_2
  - change1
  - change2
*file-3
  - change1
  - change2"

Поскольку эта строка сохраняется как переменная, я хотел передать скрипту эту переменную в качестве параметра:

param(
[string]$NORMAL_STRING,
[string]$MULTILINE_STRING
)

echo $NORMAL_STRING
echo $MULTILINE_STRING

запустить скрипт

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

powershell .\test.ps1 -NORMAL_STRING "This is a Normal String!" -MULTILINE_STRING $MLINE_VARIABLE

Первый запуск приводит к следующему длинному сообщению об ошибке (сообщение об ошибке было на немецком языке, и я перевел первое появление ошибки):

powershell : In line:2 char:4
In line:1 char:1
+ powershell .\small_test.ps1 -NORMAL_STRING "THIS IS A NORMAL STRING!" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (In line:2 char:4:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
+   - change1
+    ~
Missing expression after unary operator '-'.
In line:2 char:5
+   - change1
+     ~~~~~~~
Unexpected token "change1" in expression or statement.
In line:3 char:4
.
.
.
Not all analytical errors were reported. Correct the reported errors and try again.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

В следующем тесте я не использовал многострочную строку для проверки работоспособности:

powershell .\test.ps1 -NORMAL_STRING "This is a Normal String!"

Я понял, что скрипт работает, но показывает только первые 2 записи обычной строки:

>> This
>> is

Я предполагаю, что каким-то образом NORMAL_STRING было установлено на This, а отсутствующий параметр MULTILINE_STRING был установлен на is.

Итак, чтобы проверить, работают ли сценарии так, как задумано, я изменил параметр -NORMAL_STRING "This_is_a_normal_Parameter" и вместо использования параметра $MULTILINE_STRING as установил его внутри сценария.

Что мне нужно

Как я могу успешно передать этот многострочный параметр, не перепутав все переменные?


person MaKaNu    schedule 13.01.2021    source источник
comment
Убрать запятую после последнего параметра в блоке param() и при вызове скрипта добавить параметр -File как в powershell -File D:\Test\test.ps1 -NORMAL_STRING "This is a Normal String!" -MULTILINE_STRING $MLINE_VARIABLE   -  person Theo    schedule 13.01.2021
comment
Вы правы с запятой, это просто остатки от копирования и пасты. Этого не было внутри фактического тестового сценария. Этот -File действительно настоящий автор. Вы можете трансформировать его как авсер, так что я могу принять. Может быть, с немного больше информации об этом. Большое спасибо.   -  person MaKaNu    schedule 13.01.2021
comment
Спасибо, я разместил это как ответ сейчас.   -  person Theo    schedule 13.01.2021


Ответы (1)


Без использования параметра -File то, что следует после powershell.exe, рассматривается как -Command, которое выполняет указанные команды (и любые параметры), как если бы они были введены в командной строке PowerShell.

Однако в этом случае вы хотите, чтобы он запускал другой скрипт PowerShell, хранящийся в файле.
При использовании с -File <PathToTheScript> скрипт запускается в локальной области (с точечным источником), поэтому функции и переменные, которые скрипт выполняет создания доступны в текущем сеансе.
Все значения, введенные после параметра File, интерпретируются как путь к файлу сценария и параметры, переданные этому сценарию.

Это означает, что изменение кода на

powershell -File '.\test.ps1' -NORMAL_STRING "This is a Normal String!" -MULTILINE_STRING $MLINE_VARIABLE

будет работать как задумано

person Theo    schedule 13.01.2021