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

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

06.08.2019, 11:47. Показов 10611. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru