问题描述
当我从我的 .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)
当我尝试使用 Return
、Out-File
、Export to CSV
等输出相同的信息时......我得到 3 行 Write-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 fromWrite-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-Host
和 Write-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-File
或 Set-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
这篇关于输出文件与写入主机不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!