输出文件与写入主机不匹配 [英] Output file doesn't match Write-Host

查看:65
本文介绍了输出文件与写入主机不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When I Write-Host from my .ps1 file I see:

Parentfolder >> ChildFolder

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

When I output to a file, I see:

ParentFolder
>>
ChildFolder

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

I am using a simple write-host ($childgroup.name), ">>", ($object.samaccountname)

当我尝试使用 ReturnOut-FileExport to CSV 等输出相同的信息时......我得到 3Write-Host 打印为单行.

When I try to output the same information using Return, Out-File, Export to CSV, etc... I get 3 lines for what Write-Host prints as a single line.

我只希望输出文件的格式与 Write-Host 输出的格式相同.

I just want the output file to be in the same format as the Write-Host output.

根据要求:

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") 
}

推荐答案

注意事项:

  • 写-主机用于显示输出,而不是输出数据——它绕过PowerShell的成功输出流(PowerShell 的 stdout 等价物),因此 Write-Host 的输出不能(直接[1])在变量中捕获,也不能重定向到文件 - 请参阅这个答案的下半部分,了解更多信息.

  • 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 this answer for more information.

使用写- 输出 或 - 最好 - PowerShell 的隐式输出行为输出数据,适合进一步程序化处理.

Use Write-Output or - preferably - PowerShell's implicit output behavior to output data, suitable for further programmatic processing.

除了这个根本区别之外,Write-HostWrite-Output 在处理参数的方式上也有所不同:

In addition to this fundamental difference, Write-Host and Write-Output also differ in how they handle arguments:

# 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命令是:

Using implicit output, the equivalent of the above Write-Output command is:

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

如果您重定向 Write-Output 命令或其隐式等效于 file(带有 >/Out-FileSet-Content[2]),您将获得相同的 3 行表示.

If you redirect the Write-Output command or its implicit equivalent to a file (with > / Out-File or Set-Content[2]), you'll get the same 3-line representation.

此外,Write-Host 对复杂对象执行简单的 .ToString() 字符串化,这通常会导致无用的输出;相比之下,Write-Output/隐式输出使用 PowerShell 的丰富格式系统:

Additionally, Write-Host performs simple .ToString() stringification on complex objects, which often results in unhelpful output; by contrast, Write-Output / implicit output uses PowerShell's rich formatting system:

# 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;酒吧 = 2 } |Out-Host) 您确实获得了通常的、丰富的输出格式,您可以通过 Write-Output/默认情况下获得 - 同时仍仅打印到显示器.

Note: If you use the Out-Host cmdlet and pipe a command to it (e.g.
@{ foo = 1; bar = 2 } | Out-Host) you do get the usual, rich output formatting that you get via Write-Output / by default - while still printing to the display only.

如果您确实想将单行输出为数据,请使用带引号的字符串;要引用变量并将子表达式嵌入字符串中,请使用可扩展字符串(字符串插值)、"..."(请参阅about_Quoting_Rules),或使用字符串连接 (+)

If you do want to output a single line as data, use a quoted string; to reference variables and embed subexpressions in a string, use an expandable string (string interpolation), "..." (see about_Quoting_Rules), or use string concatenation (+)

$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 = &{写主机嗨} 6>&1.但是,请注意,信息输出流主要设计为与 PSv5+ Write-Information cmdlet 和常见的 -InformationAction 参数一起使用.


[1] In PowerShell v5 or higher, you can capture/redirect Write-Host output, via the information output stream, number 6; e.g.: $writeHostOutput = & { Write-Host hi } 6>&1. However, note that the information output stream is primarily designed to work with the PSv5+ Write-Information cmdlet and the common -InformationAction parameter.

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

[2] With strings only, > / Out-File behave the same as Set-Content, except that in Windows PowerShell a different default character applies (not in PowerShell Core). For more information about the differences, see this answer.

这篇关于输出文件与写入主机不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆