输出文件与写入主机不匹配

Output file doesn't match Write-Host

当我从我的 .ps1 文件中 Write-Host 时,我看到:

Parentfolder >> ChildFolder

当我输出到文件时,我看到:

ParentFolder
>>
ChildFolder

我使用的是简单的 write-host ($childgroup.name), ">>", ($object.samaccountname)

当我尝试使用 ReturnOut-FileExport 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") 
}

警告:

  • Write-Host is meant for to-display output, not for outputting data - it bypasses PowerShell's success output stream (PowerShell's stdout equivalent), so that output from Write-Host cannot (directly[1]) be captured in a variable, nor redirected to file - see the bottom half of 了解更多信息。

  • 使用 Write-Output 或 - 最好 - PowerShell 的 implicit 输出 行为输出数据,适合进一步程序化处理.

除了这个根本区别之外,Write-HostWrite-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-FileSet-Content[2]),你会得到相同的 3 行表示。

此外,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 或更高版本中,您 可以 capture/redirect Write-Host 输出,通过 信息输出流,数量6;例如:$writeHostOutput = & { Write-Host hi } 6>&1。但是,请注意,信息输出流主要设计用于与 PSv5+ Write-Information cmdlet 和通用 -InformationAction 参数一起使用。

[2] 仅使用 字符串 > / Out-File 的行为与 Set-Content 相同,除了在 Windows PowerShell 中应用不同的默认字符(不在 PowerShell Core 中)。有关差异的详细信息,请参阅 this answer.