#powershell
#powershell
Вопрос:
Я долгое время был энтузиастом Bash, пытаясь освоиться с Powershell. Я пытаюсь сделать что-то, что можно было бы легко выполнить с помощью Awk, но, похоже, я не могу найти решение в документации Powershell. По сути, я пытаюсь выбрать третье значение из выходных данных команды, разделенных /
Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Select-Object -ExpandProperty CanonicalName | Select-String ".*/Example/.*"
example.local/Example/ExampleOU1
example.local/Example/ExampleOU2
Я просто хочу выбрать последнее значение, показанное здесь. В среде Bash это может быть легко выполнено с помощью awk -F "/" '{print $3}'
однако я изо всех сил пытаюсь найти эквивалент в Powershell. Я нашел Out-String | %{ $_.Split('/')[2]; }'
, что неплохо, но работает только при наличии одного объекта. Я предполагаю, что мне нужно ForEach-Object
преобразовать в строку, затем разделить, но я не уверен, как это сделать.
Комментарии:
1.
%
является псевдонимом дляforeach-object
.out-string
Здесь нет необходимости, если вы выполняете итерацию с использованием конвейера иforeach-object
. Простой способ для последнего значения$output -replace '.*/'
2. Я решил, что мои ответы были скорее вредными, чем полезными, поэтому я удалил их.
3. Возможно, вы захотите попробовать пошалить с сохранением выходных данных вашей команды в $ ADObject, а затем возиться с $ ADObject. Каноническое имя, если оно существует. Если он существует, он должен быть массивом строк. Если это массив строк, исходящая строка является излишней.
4. Возможно,
Get-ADOrganizationalUnit -Properties CanonicalName -Filter * | Select-Object -Property CanonicalName | ForEach-Object { ($_ -split '/')[2] }
Примечание: это непроверено, поскольку мой компьютер не находится в домене.
Ответ №1:
Я почти никогда не использую исходящую строку. Canonicalname — это свойство объекта, поэтому вам нужно ссылаться на это свойство. Это сработало бы:
[pscustomobject]@{canonicalname = 'example.local/Example/ExampleOU1'} |
% { $_.canonicalname.Split('/')[2] }
ExampleOU1
Также есть -split, который использует регулярное выражение:
[pscustomobject]@{canonicalname = 'example.local/Example/ExampleOU1'} |
% { ($_.canonicalname -split '/')[2] }
Пути появляются так часто, что для этого есть команда:
[pscustomobject]@{canonicalname = 'example.local/Example/ExampleOU1'} |
% { split-path -leaf $_.canonicalname }