Переключатель-Match работает не так, как ожидалось

#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. Спасибо за объяснение