@mdkolpakov

Почему переменная перестаёт выводиться в терминал?

Скрипт помогает выбрать файловый ресурс, после чего выводит список отфильтрованных групп, которые вхожи в ресурс, а потом позволяет посмотреть информацию о пользователях этой группы.

clear
Get-SmbMapping | Format-Table 
Import-Module ActiveDirectory
 
$way_to_res = Read-Host "Введите сервер "
$way_to_res1 = '\\' + $way_to_res + '\Folder'
Get-ChildItem -Path $way_to_res1 | Format-table Name
    
$inp_res = Read-Host "Введите каталог "
$kek = $way_to_res1 +'\'+ $inp_res
 
$lol = Get-Acl $kek
$lol = $lol.Access | Where-Object  `
    {
    $_.IdentityReference -notlike "*test1*" -and ` 
    $_.IdentityReference -notlike "*test2*" -and `
    $_.IdentityReference -notlike "test3" -and `
    $_.IdentityReference -notlike "test4" -and `
    $_.IdentityReference -notlike "*test5*" -and `
    $_.IdentityReference -notlike "*test6*"} 
#Write-Host 'Пользовательские группы' -ForegroundColor Magenta
$lol.IdentityReference
 
#Write-Host 'Сетевые диски' -ForegroundColor Cyan
Get-SmbMapping | Format-Table 
 
$var1 = Read-Host "Введите группу"
$var2 = Get-ADGroupMember -Identity $var1| Select-Object SamAccountName
$myarray = [System.Collections.ArrayList]::new()
foreach ($item in $var2)
{
$list = Get-ADUser -Identity $item.SamAccountName -Properties Description, CanonicalName |Select-Object Description, CanonicalName
[void]$myArray.Add($list)
}
$myArray
Read-Host


Дело в том, что команда Get-SmbMapping | Format-Table , которая идёт после $lol.IdentityReference, не нужна в этой части программы. Но почему то без неё я не смогу увидеть содержание $lol.IdentityReference, которая стоит перед ней. Она просто не выведется на экран.

Подскажите пожалуйста, почему так может происходить? Я бы хотел избавиться от этого костыля. Заранее благодарю.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
То же самое, что и в прошлый раз.
У вас в выводе встречаются несколько разных объектов
Сначала $lol.IdentityReference
потом $myArray
Состав полей у объектов разный. Перед выводом, собственно на экран (хост), Powershell буферизует вывод и пытается его подстроить под вас.
Для этого он берёт состав полей второго объекта (там список с полями)
PS полагает, что данный объект и должен быть примером, поэтому пытается выводить на экран для первого объекта те же поля, что и для второго. А там их, конечно, нет. В результате не выводится ничего.
Промежуточный вывод на хост через Format- разбивает буфер и вы видите оба объекта со своими полями

Ну и, как я писал в прошлый раз, необходимо выводить всё единообразно. Работаете только с экраном ?
Используйте Out-Host, Write-Host, Format-xxx
Хотите выводить в потоки, переменные и тп - используете обычные выводы
Фактически ваш вызов $lol.IdentityReference это для Powershell $lol.IdentityReference | Out-Default, потому что далее этот вывод никуда не попадает, ни в переменную, ни в поток

А вам явно бы хотелось Out-Host
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BeatHazard
Затрудняюсь ответить почему так происходит, но вызвано это функцией Format-Table.
Если хотите корректный вывод, то либо убирайте ее в вызове Get-ChildItem -Path $way_to_res1 | Format-table Name, например можно сделать так (Get-ChildItem -Path $way_to_res1).name
либо добавляйте в выводе $lol.IdentityReference | Format-Table - так будет даже лучше
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы