Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131

Как записать в переменную, определенное значение из командлета ?

06.08.2019, 11:47. Показов 10684. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

PowerShell
1
Get-VMReplication SRV-FileServer
PowerShell
1
2
3
VMName         State       Health Mode    FrequencySec PrimaryServer ReplicaServer ReplicaPort AuthType Relationship
------         -----       ------ ----    ------------ ------------- ------------- ----------- -------- ------------
SRV-FileServer Replicating Normal Replica 300          hv1           HV2           80          Kerberos Simple
Как изъять значение Normal из Health, записать его в переменную и вывести для информации через Write-Debug или подобный ему командлет ?

Я пробовал такие варианты:

PowerShell
1
2
3
$Var =  Get-VMReplication SRV-FileServer| fl -Property Health
 
Write-Debug ($Var).Health
Тут же пробовал без скобок $Var.Health иди просто $Var

Еще пробовал
PowerShell
1
$Var =  Get-VMReplication SRV-FileServer -outvariable Var| fl Health
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2019, 11:47
Ответы с готовыми решениями:

Как вытянуть определенное значение из API в переменную
Смотрю последние цены BTC/USDT: print(('price', bot.tickerPrice( symbol='BTCUSDT' ))) выводит мне: ('price',...

как записать в переменную значение id
Добрый день Есть вопрос. Карта yandex с возможностью пользователями ставить метки. вот часть кода function crdss(ttt1,ttt2) { ...

Как записать в переменную значение id?
добрый день уважаемые знатоки. У меня вопрос. есть id c значением "declat" код такой <td valign="top"><input...

17
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.08.2019, 12:33
Лучший ответ Сообщение было отмечено pEntity как решение

Решение

Цитата Сообщение от pEntity Посмотреть сообщение
Как записать в переменную, определенное значение из командлета
Выбирайте:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$VM = 'SRV-FileServer'
 
# 1 
 
$VMReplication =  Get-VMReplication -ComputerName $VM
$x = $VMReplication.Health
Write-Host "#1 $VM VMReplication Health: $x" -ForegroundColor Yellow
Remove-Variable -Name x
 
# 2
 
$x =  Get-VMReplication -ComputerName $VM | Select -ExpandProperty Health
Write-Host "#2 $VM VMReplication Health: $x" -ForegroundColor Yellow
Remove-Variable -Name x
 
# 3
 
$x =  (Get-VMReplication -ComputerName $VM).Health
Write-Host "#3 $VM VMReplication Health: $x" -ForegroundColor Yellow
Remove-Variable -Name x
 
# 4
 
Get-VMReplication -ComputerName $VM | Tee-Object -Variable VMReplication | Format-Table -AutoSize
$x = $VMReplication.Health
Write-Host "#4 $VM VMReplication Health: $x" -ForegroundColor Yellow
Remove-Variable -Name x
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
06.08.2019, 12:39  [ТС]
Круто, спасибо. А почему так не работает?
PowerShell
1
2
3
$Var =  (Get-VMReplication SRV-FileServer)
 
Write-Host "#3 VMReplication Health: $Var.Health" -ForegroundColor Yellow
Это не по типу 3 варианта ? Я ведь вроде сохранил всё в скобки в переменную $Var и потом на него сделал указать .Health?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.08.2019, 12:52
Лучший ответ Сообщение было отмечено pEntity как решение

Решение

Цитата Сообщение от pEntity Посмотреть сообщение
А почему так не работает?
PowerShell
1
2
3
4
5
6
7
8
9
# 5
 
$Var = Get-VMReplication SRV-FileServer
Write-Host "#5 VMReplication Health: $($Var.Health)" -ForegroundColor Yellow
 
# 6
 
$Var = Get-VMReplication SRV-FileServer
Write-Host "#6 VMReplication Health:"  $Var.Health -ForegroundColor Yellow


Добавлено через 4 минуты
Цитата Сообщение от pEntity Посмотреть сообщение
Я ведь вроде сохранил всё в скобки в переменную $Var
Скобки + точка и название свойства нужны для сохранения только нужного свойства, иначе никаких скобок не надо. Это просто аналог для select -expand PropertyName

Добавлено через 3 минуты
А почему вместо "VMReplication Health: $Var.Health" нужно писать "VMReplication Health: $($Var.Health)" (и ещё про всякое полезное) можно почитать тут:

http://www.neolisk.com/techblo... sandtokens
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
06.08.2019, 12:53  [ТС]
Скобки + точка и название свойства нужны для сохранения только нужного свойства
Это когда мы в теле командлета делаем ?

иначе никаких скобок не надо
А это когда через переменную ?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.08.2019, 12:57
Цитата Сообщение от pEntity Посмотреть сообщение
Это когда мы в теле командлета делаем ?
Цитата Сообщение от pEntity Посмотреть сообщение
А это когда через переменную ?
Вопросов не понял, всё что хотел показать проиллюстрировал, примерами выше

Про кавычки можно почитать, естественно, и в официальной справке:

PowerShell
1
Get-Help about_Quoting_Rules
или

https://docs.microsoft.com/en-... rshell-5.1
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
06.08.2019, 12:57  [ТС]
Хорошо, благодарю!
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
06.08.2019, 13:07
+ ещё один пример:

PowerShell
1
2
3
4
# 7
 
$VM = 'SRV-FileServer'
"#7 $(Get-Date -Format 'yyyy-MM-dd hh:mm:ss') $VM VMReplication Health: $((Get-VMReplication -ComputerName $VM).Health)" | Add-Content -Path .\log.txt -Encoding UTF8
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
06.08.2019, 13:32  [ТС]
Очуметь. Спасибо !)
0
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
08.08.2019, 09:25  [ТС]
KDE777, здравствуйте.

Подскажите, мы можем что, брать ключи командлетов как в сокращенном варианте, так и в полном ?

ft

PowerShell
1
2
3
VMName  State       Health   Mode    FrequencySec PrimaryServer ReplicaServer ReplicaPort AuthType Relationship
------  -----       ------   ----    ------------ ------------- ------------- ----------- -------- ------------
SRV-ATS Replicating Critical Replica 300          hv1           hv2           80          Kerberos Simple

Здесь просто Health

fl

PowerShell
1
2
3
4
5
6
7
8
9
10
VMName                      : SRV-ATS
ReplicationState            : Replicating
ReplicationHealth           : Critical
ReplicationMode             : Replica
ReplicationFrequencySec     : 300
ReplicationRelationshipType : Simple
PrimaryServerName           : hv1.fdo.local
ReplicaServerName           : hv2.fdo.local
ReplicaServerPort           : 80
AuthenticationType          : Kerberos
А здесь уже ReplicationHealth

Добавлено через 18 минут
Можете еще подсказать ? Я хочу пройтись по всем машинам, которая имеет статус критический, отправить на почту её имя и статус. У меня щас вхождение не работает, $ReplicationHealth пишет в себя состояния всех машин, как мне быть ? Мне как-то нужно выбрать только с критическим состоянием.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$VMReplication = Get-VMReplication
$ReplicationHealth = $ReplicationStatus.ReplicationHealth
$ReplicationKeyStatus = "Critical" 
 
Write-Host "DEBUG: "$ReplicationHealth "Key:" $ReplicationKeyStatus
 
if( [string]::Equals($ReplicationKeyStatus,$ReplicationHealth) )
{
    Write-Host "DEBUG:" $ReplicationKeyStatus
 
    $sMessage = [string]::Join(" ","Virtual machine has",$ReplicationHealth,"error")
 
    <#Send-MailMessage -From '<a.mihalevskiy@.ru>' -To '<a.mihalevskiy@.ru>' -Subject 'Replication Virtual Machine: ERROR' -Body sMessage -Priority High -SmtpServer 'email.fdo.local'
    #>
}
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.08.2019, 10:04
Цитата Сообщение от pEntity Посмотреть сообщение
мы можем что, брать ключи командлетов как в сокращенном варианте, так и в полном ?
Да можем, если не получается неоднозначности:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS C:\> Get-Date -Minute 10
 
8 августа 2019 г. 9:10:27
 
 
 
PS C:\> Get-Date -m 10
Get-Date : Не удается обработать параметр, так как имя параметра "m" неоднозначно. Возможные совпадения: -Month -Minute -Millisecond.
строка:1 знак:10
+ Get-Date -m 10
+          ~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameter,Microsoft.PowerShell.Commands.GetDateCommand
 
 
PS C:\> Get-Date -min 10
 
8 августа 2019 г. 9:10:32
Но сокращения имён параметров, как и псевдонимы командлетов, рекомендуют использовать только при ускорение работы в консоли, а в сохранённых скриптах лучше писать полностью.

Цитата Сообщение от pEntity Посмотреть сообщение
Здесь просто Health
Цитата Сообщение от pEntity Посмотреть сообщение
А здесь уже ReplicationHealth
У меня нет под рукой Hyper-V с настроенной репликацией. Возможно это разные свойства, а может свойство и его псевдоним. Проверить можно так:

PowerShell
1
Get-VMReplication | Get-Member -MemberType Properties,AliasProperty | Where Name -Match 'Health'
Добавлено через 4 минуты
Цитата Сообщение от pEntity Посмотреть сообщение
У меня щас вхождение не работает
Откуда в вашем примере берётся значение переменной $ReplicationStatus?
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
08.08.2019, 10:04  [ТС]
KDE777, благодарю. Я пока мучался сам и получилось так, это то же верно ?

PowerShell
1
2
3
4
$ReplicationKeyStatus = "Critical" 
$VMReplicationError = Get-VMReplication | Where-Object {$_.ReplicationHealth -like $ReplicationKeyStatus}
 
Write-Host "VMName: " $VMReplicationError.VMName
Проблема в том, что если более одной машины с таким состоянием, у меня все запишется в строку:

PS C:\Windows\system32> C:\Temp\test.ps1
VMName: DC EMAIL SRV-1C-MSSQL SRV-FileServer SRV-PRT

А мне как-то нужно выполнить следующий код на каждую машину. То есть мне теперь нужно заняться преобразованием строк ? Разделить строку, записать в массив, пройтись по нему циклом ?

Про $ReplicationStatus? - Лишний кусок, в процессе различных вариаций и тестов ))
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.08.2019, 11:19
Лучший ответ Сообщение было отмечено pEntity как решение

Решение

Цитата Сообщение от pEntity Посмотреть сообщение
А мне как-то нужно выполнить следующий код на каждую машину. То есть мне теперь нужно заняться преобразованием строк ? Разделить строку, записать в массив, пройтись по нему циклом ?
Вы похоже ещё совсем не знаете основ и даже базовых возможностей PowerShell. Попробуйте всё-таки прочитать первую четверть любой книжки по PS

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ForEach ($VMReplication in Get-VMReplication)
{
    $VMName  = $VMReplication.VMName
    $message = "DEBUG: $VMName ReplicationKeyStatus: $($VMReplication.ReplicationHealth)"
 
    Write-Host $message -ForegroundColor Yellow
 
    if ($VMReplication.ReplicationHealth -eq 'Critical')
    {
        $message = "Virtual machine has error!`n$message"
        #Send-MailMessage -From 'a.mihalevskiy@.ru' -To 'a.mihalevskiy@.ru' -Subject "[ERROR] Replication Virtual Machine: $VMName" -Body $message -Priority High -SmtpServer 'email.fdo.local' -Port 587
    }
 
}
Добавлено через 59 минут
Кстати, если скрипт должен запускаться из планировщика и вывод сообщений в консоль не нужен, всё сводится к одной строчке:

PowerShell
1
Get-VMReplication | Where ReplicationHealth -eq 'Critical' | ForEach {Send-MailMessage -From 'a.mihalevskiy@.ru' -To 'a.mihalevskiy@.ru' -Subject "[ERROR] Replication Virtual Machine: $($_.VMName)" -Body "Error - $($_.VMName) ReplicationStatus: $($_.ReplicationHealth)" -Priority High -SmtpServer 'email.fdo.local' -Port 587}
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
08.08.2019, 11:25  [ТС]
Круто, как всегда спасибо )

Добавлено через 46 секунд
Только у меня опять проблема. Запустил планировщик, сообщение пришло, а дальше не приходит. На запуск поставил каждую минуту.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.08.2019, 11:36
Цитата Сообщение от pEntity Посмотреть сообщение
На запуск поставил каждую минуту.
По моему, это не лучшая идея. Наверняка, если у VM статус ReplicationHealth меняется на Critical, возникает событие в журнале Windows... Если это так, тогда я бы создал задание, которое срабатывает только при возникновении такого события, например:

Привязать задачу к журналу событий Windows

и конкретный мануал:

https://www.cyberforum.ru/post13480996.html
0
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
08.08.2019, 11:40  [ТС]
Да, понимаю, но у меня сейчас проблема в планировщике. Так как код
Add-Content -Value "$(Get-Date) ERROR: $_." -Path 'C:\Temp\log.txt' -Encoding UTF8
Выполняется только при запуске задачи, а последующие задачи игнорируются.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.08.2019, 12:01
Цитата Сообщение от pEntity Посмотреть сообщение
у меня сейчас проблема в планировщике.
Смотрите что происходит в журнале этого задания...
1
351 / 270 / 67
Регистрация: 12.12.2012
Сообщений: 2,131
08.08.2019, 12:09  [ТС]
Ошибок нет. Но кожись просто из-за невнимательности, пересоздал, всё взлетело.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.08.2019, 12:09
Помогаю со студенческими работами здесь

Как записать значение в переменную?
Почему так работает: ;============================================== format PE GUI 4.0 entry start include 'win32ax.inc' ...

Как записать в переменную значение часа
Привет всем. Такой вопрос: Есть переменная в которую записано текущее время (переменная типа TDateTime), отсюда я выделяю часы минуты...

Как записать значение формы в переменную
Продеманстрируйте плиз как записать значение формы в переменную.

Как записать значение координаты в переменную?
такой вот вопрос как записать значение координаты в переменную?? var map1 = new GMaps({ div:'#map', lat: -12.043333, lng:...

Как записать значение запроса в переменную?
Добрый день! Помогите, пожалуйста. Который день уже бьюсь над этим вопросом и все никак.... Пишу на foxpro 9.0. Есть две таблицы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru