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

问题描述

当我从我的 .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 的输出不能(直接)在变量中捕获,也不能重定向到文件 - 请参阅这个答案的下半部分,了解更多信息.

  • 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) 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),您将获得相同的 3 行表示.

If you redirect the Write-Output command or its implicit equivalent to a file (with > / Out-File or Set-Content), 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 并将命令通过管道传递给它(例如
"(请参阅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



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

05-28 21:28
查看更多