2017-02-21 5 views
1

Только ради обучения.Настройка нескольких свойств одновременно - эквивалент оператора VB с выражением для предоставления подразумеваемого контекста объекта

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

Я попытался сделать что-то свое, один из них работает по какой-то странной причине.

Этот пример работает. Разрыв используется для сокращения цикла.

$Textbox | % { 
    $_.Text = "Hello World" 
    $_.Background = "Black" 
    $_.Foreground = "Green" 
    Break 
} 

Эти два примера не работают и находятся здесь, чтобы увидеть, что я пытался.

Это было с и без «$ _.» И вместо «.». Я использовал «=» и «+ =», ни одна из которых не работала.

[email protected]{ 
    Text = "Hello World" 
    Background = "Black" 
    Foreground = "Green" 
} 

$Textbox.({ 
    $_.Text = "Hello World" 
    $_.Background = "Black" 
    $_.Foreground = "Green" 
}) 

Возможно, будет более простой способ, я ничего не нашел в Google.

ответ

3

Что вы ищете является конструкция языка, такие как VB [Script] s With заявление, что позволяет установить подразумеваемый контекст для „объекта менее“ ссылки на недвижимость (например, .Text) внутри блок.

Существует нет такой конструкции в PowerShell.

Ваша первая попытка ближе эмуляции в PowerShell, хотя и за счет производительности (хотя это не имеет значения): в трубопроводе, автоматическая переменная $_ позволяет краткую ссылку на объект ввода под рукой.

Важно: Не используйте break внутри трубопровода: это будет не просто выйти из трубопровода, он будет выходить любой закрывающий петлю и, в случае отсутствия одного, в ограждающих сценарий. Используйте вместо этого return.

Тем не менее, в том случае, под рукой, только с входным объектом одного, return не требуется.


Что касается других ваших попыток:

  • Синтаксис @{...} используется только для в hashTable литералов. Попытка использовать этот синтаксис как имя свойства вызывает синтаксическую ошибку.

  • Синтаксис (...) оценивает любые прилагаемые команды/выражения; {...} определяет блок сценария .

    • Блок скрипт, который на самом деле не выполняется (что потребует &), при использовании в контексте в строки - например, имя собственности здесь, оценивает его буквального содержания между { и }, т. е. многострочная строка, которая явно не представляет собой имя существующего объекта $TextBox, поэтому общий результат $null.

    • Обратите внимание, что скрипт запуска в соответствующем строгого режима - с Set-StrictMode -Version 2 или выше - бы помечено вышеупомянутую попытку доступа несуществующей собственности как ошибки.
      Напротив, попытка присваивать несуществующей собственности всегда создает ошибку.

+0

Ну, что-то воняет, там нет. Этот ответ очень кстати. И спасибо за подсказку. Как вы узнали, что он не выходит из трубопровода? Есть ли способ проверить это для себя? – Captor

+0

@Captor: Спасибо; поместите свой первый фрагмент в сценарий, поместите команду, которая выводит результат после конвейера, затем запустите скрипт: вы увидите, что команда после конвейера никогда не запускается. – mklement0

+0

Ahh! Понимаю. Get-Process действительно не запускался. Однако с возвратом он это сделал. Это отличная информация! Самоучитель или учеба? – Captor

0

В случае, если поддерживать словари (Hashtables) свойств для других целей, а также, вы можете написать простую функцию, которая применяет данные к объекту:

function Set-Properties(
    [parameter(ValueFromPipeline)] $inputObject, 
    [hashtable] $properties, 
    [switch] $passThru 
) { 
    process { 
     Add-Member -InputObject $inputObject -NotePropertyMembers $properties -force 
     if ([bool]$passThru) { $inputObject } 
    } 
} 

Использование:

Set-Properties $Textbox @{ 
    Text = "Hello World" 
    Background = "Black" 
    Foreground = "Green" 
} 

$Textbox1, $Textbox2 | Set-Properties -properties @{ 
    Text = "Hello World" 
    Background = "Black" 
    Foreground = "Green" 
} -passThru | ForEach { 
    # do something 
} 
+0

Это удобно, но есть две оговорки: (a) вы создаете _forcing_имя заданных свойств, что означает, что вы не получите ошибку, если вы случайно присвоили свойство, которое ранее не существовало, и (b) использование обычных хеш-таблиц с неупорядоченными ключами в сочетании с 'Add-Member -Force' обычно изменяет порядок перечисления свойств объекта. – mklement0

+1

Да, вы написали это лучше, чем я намеревался. Во всяком случае, это примитивный упрощенный пример. – wOxxOm

Смежные вопросы