Basi c Windows 10 Вопрос PowerShell об инициализации переменных и передаче аргументов - PullRequest
1 голос
/ 24 апреля 2020

В настоящее время я изучаю Powershell и как написать скрипт для запуска приложения. Следующий фрагмент кода я позаимствовал и изменил, чтобы узнать, как запустить блокнот. Вопрос, который у меня есть, состоит в том, что $args.Clone() делает или происходит? (Это из исходного кода, в котором был задан / вызван другой путь и исполняемая программа.) Я понимаю, что переменная $ myArgs инициализируется слева от знака равенства функцией справа. Тем не менее, мне не удалось найти ресурсы о том, что вы можете сделать с .Clone(), поэтому я решил попробовать и спросить здесь.

Кстати, скрипт работает, так как запускает notepad.exe и называет текст файл pp. Если файл ранее не был создан, он спрашивает меня, хочу ли я назвать текстовый файл «pp».

$exePath = $env:NOTEPAD_HOME + '/Windows/notepad.exe'
$myArgs = $args.Clone()
$myArgs += '-pp'
$myArgs += $env:NOTEPAD_HOME
& $exePath $myArgs

1 Ответ

0 голосов
/ 24 апреля 2020

tl; dr

Ваша модификация $myArgs может быть упрощена следующим образом:

$myArgs = $args + '-pp' + $env:NOTEPAD_HOME

С массивом в качестве LHS, оператор + выполняет объединение , т. Е. Он добавляет к массиву, хотя следует отметить, что добавление означает, что в процессе создается массив new , учитывая, что массивы являются структурами данных фиксированного размера в. NET.

Тот факт, что массив new неявно создается в любом случае, делает ненужным вызов .Clone() в вашем коде.


Справочная информация

Обычно - и в случае automati c $args переменная - метод .Clone() является реализацией System.ICloneable интерфейс .

Цель .Clone() - создать копию (клон) объекта, но - как ответ связан с BACON объясняет - семантика этой операции - неглубоко (см. Ниже) против глубины копирование - не предписано, поэтому использование System.ICloneable обычно не рекомендуется .

$args - это массив ( System.Array), а для массивов .Clone() создает так называемую мелкую копию. То есть, как элементы массива копирование зависит от того, являются ли они экземплярами типов значений или ссылок типов:

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

  • для элементов ссылочного типа , новый массив будет иметь копию ссылки элементов исходного массива, что означает, что элементы обоих массивов указывают на одинаковые данные (объекты).

Для получения дополнительной информации о типах значений и ссылочных типах см. этот ответ .

PowerShell неявно клонирует массивы в Способ описан при использовании += и +.

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