Обратите внимание, что этот ответ не решение, потому что (на момент написания этой статьи) недостаточно информации для диагностики вашей проблемы;однако ваше использование операторов -like
и -match
заслуживает некоторого изучения.
$_.Name -match $ServerName+"*"
(более кратко: $_.Name -match "$ServerName*"
) равно , а не аналогично $_.Name -like "$ServerName*"
:
-match
использует регулярные выражения (регулярные выражения), , которое (также) соответствует части ввода , если явно не сформулировано, чтобы соответствовать в начале (^
) и / или конце ($
) ввода.
-like
использует подстановочные выражения , которые должны соответствовать вводу в целом .
Хотя регулярные выражения и символы подстановки связаны между собой, их синтаксис и возможности различны;регулярные выражения гораздо более мощные ;в данном случае (обратите внимание, что при сопоставлении по умолчанию регистр не учитывается):
... -like 'ServerXX*'
соответствует строке, которая начинается с ServerXX
и сопровождаетсяна ноль или более произвольных символов (*
).
- Входы
'ServerXX'
, 'ServerXX.foo.bar'
и 'ServerXXY'
будут возвращать $true
.
... -match 'ServerXX*'
соответствует строке, содержащей подстроку ServerX
(просто one X
!) в любом месте ввода , если следоватьна ноль или более (*
) X
символов, поскольку дублирующий символ *
изменяет предыдущий символ / подвыражение.
- При вводе
'ServerXX'
и 'ServerXX.foo.bar'
вернет $true
, так же как и 'ServerX'
и 'fooServerXX'
- что нежелательно в этом случае.
Если ваши входные данные являются полными доменными именами, используйте одно из следующихВыражения, которые эквивалентны:
... -like 'ServerXX.*'
... -match '^ServerXX\.'
Если имя сервера предоставляется через переменную , например, $ServerName
, используйте "..."
, расширяемая улing , в простейшем случае:
... -like "$ServerName.*"
... -match "^$ServerName\."
Это хорошо в случае имен серверов , поскольку они не могут содержать символы, которые могут быть ошибочно интерпретированы какрегулярное выражение / подстановочный знак метасимволы (символы со специальным значением, например *
).
Как правило, , самый безопасный подход заключается в явном escape значение переменной, чтобы гарантировать, что литерал использует , хотя учтите, что , нуждающийся в этом, гораздо более вероятно в регулярном выражении , чем в подстановочном выражении , поскольку регулярные выражения имеют гораздо больше метасимволов:
... -like ('{0}.*' -f [System.Management.Automation.WildcardPattern]::Escape($ServerName))
... -match ('^{0}\.' -f [regex]::Escape($ServerName))
Использование строки шаблона в одинарных кавычках с -f
, оператором формата ({0}
представляет 1-й операнд RHS), делает очевидным, какие части используются буквально, и какие части объединяются как экранированное значение переменной.