Выходной файл не соответствует Write-Host

Когда я 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") 
}

person Stephen-HHC    schedule 04.10.2019    source источник
comment
Это непонятно. Пожалуйста, отредактируйте свой вопрос и покажите содержание вашего скрипта, а также то, как вы его запускаете.   -  person Ansgar Wiechers    schedule 04.10.2019
comment
непонятно ??? Простой вопрос. Когда я использую Write-Host, я получаю одну строку с результатом1 ›› результат2 из моего скрипта. Когда я выводю его в файл, я получаю результат1 в строке, ›› в следующей строке и результат2 в третьей строке. Мой вопрос в том, как добиться того, чтобы выходные данные выходного файла соответствовали выходным данным Write-Host.   -  person Stephen-HHC    schedule 04.10.2019
comment
Что вы пробовали и почему то, что вы пробовали, потерпело неудачу? В идеале вы должны предоставить минимальный воспроизводимый пример того, что вы пробовали, и включить конкретную информацию о том, как это не удалось. , с сообщениями об ошибках и / или ошибочным выводом. Stack Overflow не является сервисом для написания кода; Лучшие вопросы - это те, которые содержат полезную информацию, чтобы те, кто ответил, могли помочь вам разработать свой собственный правильный ответ. См. Как задать хороший вопрос.   -  person Jeff Zeitlin    schedule 04.10.2019
comment
Возникли проблемы с пониманием того, как он может выдавать другой результат только из-за того, где он подключен. Вы уверены, что проблема не в том, как вы просматриваете файл? Например, вы можете просматривать в Блокноте с включенным переносом слов или могут быть невидимые символы, которые интерпретируются вашим текстовым редактором по-разному, а не консолью.   -  person John Wu    schedule 04.10.2019
comment
Я пробовал: out-File, Return, Export-CSV, Transcript, Write-Output и некоторые другие, но безрезультатно.   -  person Stephen-HHC    schedule 04.10.2019
comment
Двойная проверка, без переноса слов. Notepad ++ показывает символы конца строки.   -  person Stephen-HHC    schedule 04.10.2019
comment
Создайте одну строку, если вы хотите, чтобы вывод был в одной строке, на данный момент у вас их три. например $ outputstring = $ childgroup.name + ›› + $ object.samaccountname. Однако было бы намного лучше, если бы вы научились правильно использовать объекты.   -  person Scepticalist    schedule 04.10.2019


Ответы (1)


Предупреждение:

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

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

Помимо этого фундаментального различия, 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 или ее неявный эквивалент в файл> / Out-File или Set-Content [2]), вы получите такое же трехстрочное представление.

Кроме того, Write-Host выполняет простую .ToString() строковую обработку сложных объектов, что часто приводит к бесполезным результатам; Напротив, Write-Output / неявный вывод использует богатую систему форматирования PowerShell:

# Write-Host: Unhelpful representation; entries are enumerated
#             and .ToString() is called on each.
PS> Write-Host @{ foo = 1; bar = 2 }
System.Collections.DictionaryEntry System.Collections.DictionaryEntry

# Write-Output / implicit output: rich formatting
PS> @{ foo = 1 }

Name                           Value
----                           -----
foo                            1
bar                            2

Примечание. Если вы используете Out-Host cmdlet и передайте ему команду (например,
@{ foo = 1; bar = 2 } | Out-Host), вы получите обычное, расширенное форматирование вывода, которое вы получаете через Write-Output / по умолчанию - при этом все еще выводя на дисплей только .


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

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

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

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

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

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

person mklement0    schedule 04.10.2019