#powershell
Вопрос:
Я использую quser для получения сеанса rdp в отключенном состоянии
-Совпадение работает не так, как я ожидал, «$env:ИМЯ ПОЛЬЗОВАТЕЛЯ » игнорируется
$computers = 'computer1','computer2','computer3','computer4'
foreach ($computer in $computers){
quser /server:$computer | ? { $_ -match “Disc” -and '$env:USERNAME'}|foreach {
$Session = ($_ -split ‘ ’)[2]
$user = ($_ -split ‘ ’)[1]
$idletime= ($_ -split ‘ ’)[4]
logoff /SERVER:$computer $Session
}}
Комментарии:
1. А чего ты ожидал? Что случилось? Что
-and '$env:USERNAME'
предполагается делать (кстати, это всегда будет оцениваться$true
)? Может быть, вы хотели это сделать$_ -match "Disc" -and $_ -match $env:USERNAME
?2. Спасибо @MathiasR.Jessen $_ -сопоставьте «Диск» -и $_ -сопоставьте $env:ИМЯ ПОЛЬЗОВАТЕЛЯ сработало
Ответ №1:
-and
Оператор является оператором логической логики — он вычисляет выражения с обеих сторон, приводит их к a [bool]
(например, $true
или $false
), а затем возвращает $true
, если и только если оба выражения оцениваются $true
как .
Принуждение непустой строки (например '$env:USERNAME'
) [bool]
неизменно приводит к $true
:
PS ~> [bool]'$env:USERNAME'
True
Таким образом, условие, которое вы эффективно оцениваете, заключается в:
($_ -match "Disc") -and $true
Что логически точно так же, как просто делать:
$_ -match "Disc"
сама по себе.
Если вы хотите выполнить 2 -match
сравнения и убедиться, что они оба верны, вам нужно изменить выражение на:
... |? { $_ -match "disc" -and $_ -match $env:USERNAME } | ...
Обратите внимание, что я не заключаю $env:USERNAME
его в ''
кавычки в одинарные кавычки, создавая строку с буквальным значением $env:USERNAME
(которое не является допустимым именем учетной записи в Windows).
Комментарии:
1. Спасибо за объяснение