POWERSHELL извлеките электронную почту и используйте ее [дубликат]

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

77
задан Peter Mortensen 4 December 2014 в 23:56
поделиться

5 ответов

Конечно

write-host ($obj | Select -ExpandProperty "SomeProp")

Или, если это важно:

$obj."SomeProp"
120
ответ дан aquinas 19 August 2018 в 02:39
поделиться
  • 1
    помните, чтобы развернуть: select -expand "SomeProp", если вы хотите получить значение. select "SomeProp" возвращает пользовательский объект с свойством & quot; SomeProp & quot ;, а затем он довольно сильно возвращается на шаге 1. – Frode F. 18 January 2013 в 21:48
  • 2
    Есть ли способ использовать $obj."SomeProp" в write-host? – The Muffin Man 10 January 2016 в 02:12
  • 3
    @ TheMuffinMan, да, это общеприменимая функция, такая как write-host $ obj. & Quot; $ somepropertyname & quot; – Elroy Flynn 26 May 2017 в 01:44
  • 4
    Когда ваша строка находится в переменной, $obj.($propName) также работает. (Скобки не требуются, но он выглядит действительно странным для меня без них.) – jpmc26 19 April 2018 в 02:39
  • 5
    Если у вас есть $propName, хранящийся в объекте, например $Headers.PropertyName, тогда требуются скобки $obj.($Headers.PropertyName). – Jonas Lomholdt 9 August 2018 в 13:25

Вы можете получить свойство по имени с помощью командлета Select-Object и указать имена (имена) свойств, которые вас интересуют. Обратите внимание, что это не просто возвращает исходное значение для этого свойства; вместо этого вы получаете то, что по-прежнему ведет себя как объект.

[PS]> $property = (Get-Process)[0] | Select-Object -Property Name

[PS]> $property

Name
----
armsvc

[PS]> $property.GetType().FullName
System.Management.Automation.PSCustomObject

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

[PS]> $property.Name
armsvc

[PS]> $property -eq "armsvc"
False

[PS]> $property.Name -eq "armsvc"
True

[PS]> $property.Name.GetType().FullName
System.String

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

[PS]> "The first process in the list is: $($property.Name)"
The first process in the list is: armsvc

Совершенно правильно, другие ответили на этот вопрос, рекомендуя параметр -ExpandProperty для командлета Select-Object. Это обходит часть головной боли, возвращая значение указанного свойства, но вы захотите использовать разные подходы в разных сценариях.

-ExpandProperty <String>

Определяет свойство для выбора и указывает, что необходимо попытаться расширить это свойство

https://technet.microsoft.com/en-us/library/hh849895.aspx

[PS]> (Get-Process)[0] | Select-Object -ExpandProperty Name
armsvc

10
ответ дан Charlie Joynt 19 August 2018 в 02:39
поделиться

Попробуйте следующее:

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
2
ответ дан John Slegers 19 August 2018 в 02:39
поделиться
  • 1
    Добро пожаловать в StackOverflow, пожалуйста, отредактируйте свой вопрос и объясните why , что он должен попробовать это, и why он улучшает уже существующие ответы. – T3 H40 15 January 2016 в 15:41
$com1 = new-object PSobject                                                         #Task1
$com2 = new-object PSobject                                                         #Task1
$com3 = new-object PSobject                                                         #Task1



$com1 | add-member noteproperty -name user -value jindpal                           #Task2
$com1 | add-member noteproperty -name code -value IT01                              #Task2
$com1 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com2 | add-member noteproperty -name user -value singh                             #Task2
$com2 | add-member noteproperty -name code -value IT02                              #Task2
$com2 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com3 | add-member noteproperty -name user -value dhanoa                             #Task2
$com3 | add-member noteproperty -name code -value IT03                               #Task2
$com3 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}        #Task3


$arr += $com1, $com2, $com3                                                          #Task4


write-host "windows version of computer1 is: "$com1.ver()                            #Task3
write-host "user name of computer1 is: "$com1.user                                   #Task6
write-host "code of computer1 is: "$com1,code                                        #Task5
write-host "windows version of computer2 is: "$com2.ver()                            #Task3
write-host "user name of computer2 is: "$com2.user                                   #Task6
write-host "windows version of computer3 is: "$com3.ver()                            #Task3
write-host "user name of computer3 is: "$com1.user                                   #Task6
write-host "code of computer3 is: "$com3,code                                        #Task5

read-host
0
ответ дан Laurel 19 August 2018 в 02:39
поделиться
  • 1
    $ arr = @ ("jind", 12, "singh") write-host $ arr [1] read-host $ arr + = "reza & quot; write-host $ arr [3] read-host write-host $ arr [$ arr.length-1] read-host $ arr = $ arr -ne $ arr [1] write-host $ arr read-host foreach ($ i в $ arr) {write-host $ i} – dhanoa 12 October 2016 в 23:04

Расширение на @aquinas:

Get-something | select -ExpandProperty PropertyName

или

Get-something | select -expand PropertyName

или

Get-something | select -exp PropertyName

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

При управлении Office 365 через PowerShell, вот пример, который я использовал для получения всех пользователей / группы, которые были добавлены в список «BookInPolicy»:

Get-CalendarProcessing conferenceroom@domain.com | Select -expand BookInPolicy

Просто использование «Select BookInPolicy» отрезало нескольких участников, поэтому спасибо за эту информацию!

29
ответ дан Peter Mortensen 19 August 2018 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: