Выходной файл не соответствует Write-Host - PullRequest
1 голос
/ 04 октября 2019

Когда я Write-Host из моего .ps1 файла, я вижу:

Parentfolder >> ChildFolder

Когда я вывожу в файл, я вижу:

ParentFolder
>>
ChildFolder

Я использую простой write-host ($childgroup.name), ">>", ($object.samaccountname)

Когда я пытаюсь вывести ту же информацию, используя Return, Out-File, Export to CSV и т. Д ..., я получаю 3 строк для того, что Write-Host печатает как одна строка .

Я просто хочу, чтобы выходной файл был в том же формате, что и вывод Write-Host.

по запросу:

function getchildgroups($groupname) {

    # Get initial group details and members
    $childgroup = get-adgroup $groupname -properties member

    # Only continue if this group has members
    if (($childgroup.member).count -gt 0) {

        # Loop through each member of the group
        foreach ($memberobject in $childgroup.member) {

            try {
                $object = get-adobject $memberobject -properties *;

                # If the member of the group is another group
                if ($object.objectclass -eq "group")  {

                    # Print it to the screen

                    write-host ($childgroup.name),">>", ($object.samaccountname) 
                   #$cgname = $childgroup.name
                    #$objname =$object.samaccountname
                    #Return (($cgname, ">>", $objname)) >> 
c:\Temp\NestedGroups.txt

                    # Recursive lookup the members of the sub-group (if 
not self-nested)
                    if ($memberobject -ne $object.distinguishedname) {

                        getchildgroups($object.distinguishedname);
                    }
                }
            } catch {}
        }
    }
}

# Run the function with your group name
$Groups = Get-Content C:\temp\ListOfFolders.txt
Foreach ($Group in $Groups){
getchildgroups("$group") 
}

1 Ответ

1 голос
/ 04 октября 2019

Предостережение :

  • Write-Host предназначено для для отображения вывода , а не для вывода data - он обходит Поток вывода успешного завершения PowerShell (эквивалент стандартного вывода PowerShell), поэтому вывод из Write-Host не может (непосредственно [1] ) быть записан в переменнойили не перенаправлены в файл - см. нижнюю половину этого ответа для получения дополнительной информации.

  • Используйте Write-Output или - предпочтительно - PowerShell неявный вывод поведение вывод данные , подходящий для дальнейшей программный обработка .

В дополнение к этому фундаментальному различию Write-Host и Write-Output также отличаются по тому, как они обрабатывают аргументы :

# What Write-Host prints to the display is a *single string* that is 
# the space-separated list of the (stringification of) its arguments.
PS> Write-Host file1, '>>', file2
file1 >> file2  # printed to *display* only

# Write-Output outputs each argument - whatever its data type - *separately*
# to the success output stream.
# In the case of *string* arguments, each string renders *on its own line*.
PS> Write-Output file1, '>>', file2
file1
>>
file2

Использование неявного вывода, эквивалент вышеупомянутой команды Write-Output:

# Send an array of 3 strings to the success stream.
PS> 'file1', '>>', 'file2'
file1
>>
file2

Если вы перенаправите команду Write-Output или ее неявный эквивалент toa file > / Out-File или Set-Content [2] ), вы получите такое же трехстрочное представление.


Если вы хотите вывести одну строку в виде data , используйте строку в кавычках ;чтобы ссылаться на переменные и вставлять подвыражения в строку, используйте расширяемую строку (интерполяция строки), "... "(см. about_Quoting_Rules ), или используйте объединение строк (+)

$arg1 = 'file1'; $arg2 = 'file2'

# Expandable string
PS> "$arg1 >> $arg2"
file1 >> file2

# String concatenation
PS> $arg1 + ' >> ' + $arg2
file1 >> file2

[1] В PowerShell v5 или более поздней версии вы можете сделать захватВывод / redirect Write-Host через поток вывода информации , номер 6, например: $writeHostOutput = & { Write-Host hi } 6>&1. Однако обратите внимание, что поток вывода информации в первую очередь предназначен для работы с командлетом PSv5 + Write-Informationи общий параметр -InformationAction.

[2] При только строки , > / Out-File ведут себя так же, как Set-Content, за исключением того, чтов Windows PowerShell применяется другой символ по умолчанию (не в PowerShell Core ). Для получения дополнительной информации о различиях см. этот ответ .

...