将PowerShell变量输出到文本文件

将PowerShell变量输出到文本文件,powershell,Powershell,我是PowerShell的新手,有一个脚本可以在Active Directory中循环搜索某些计算机。我得到几个变量,然后运行函数来检查诸如和注册表设置之类的内容 在控制台中,我的脚本运行良好且简单的命令,可以根据需要在屏幕上打印数据。我知道何时使用管道…但我不希望从管道打印 我想把变量写入一个文本文件,继续循环,检查AD中的下一台计算机……在下一行输出相同变量的下一次迭代。这是我的写主机: Write-Host ($computer)","($Speed)","($Regcheck)","($

我是PowerShell的新手,有一个脚本可以在Active Directory中循环搜索某些计算机。我得到几个变量,然后运行函数来检查诸如和注册表设置之类的内容

在控制台中,我的脚本运行良好且简单的命令,可以根据需要在屏幕上打印数据。我知道何时使用管道…但我不希望从管道打印

我想把变量写入一个文本文件,继续循环,检查AD中的下一台计算机……在下一行输出相同变量的下一次迭代。这是我的写主机:

Write-Host ($computer)","($Speed)","($Regcheck)","($OU)
输出文件:

$computer,$Speed,$Regcheck | out-file -filepath C:\temp\scripts\pshell\dump.txt -append -width 200

它给了我数据,但每个变量都有自己的一行。为什么?我希望所有变量都用逗号分隔在一行上。有没有类似于VB writeline的简单方法?我的PowerShell版本似乎是2.0。

我通常在这些循环中构造自定义对象,然后将这些对象添加到可以轻松操作、排序、导出到CSV等的数组中:

# Construct an out-array to use for data export
$OutArray = @()

# The computer loop you already have
foreach ($server in $serverlist)
    {
        # Construct an object
        $myobj = "" | Select "computer", "Speed", "Regcheck"

        # Fill the object
        $myobj.computer = $computer
        $myobj.speed = $speed
        $myobj.regcheck = $regcheck

        # Add the object to the out-array
        $outarray += $myobj

        # Wipe the object just to be sure
        $myobj = $null
    }

# After the loop, export the array to CSV
$outarray | export-csv "somefile.csv"
使用以下命令:

"$computer, $Speed, $Regcheck" | out-file -filepath C:\temp\scripts\pshell\dump.txt -append -width 200

简单的解决方案是避免在管道连接到之前创建阵列。PowerShell的规则#1是逗号是一个特殊的分隔符,默认行为是创建一个数组。连接是这样完成的

$computer + "," + $Speed + "," + $Regcheck | out-file -filepath C:\temp\scripts\pshell\dump.txt -append -width 200
这将创建一个包含三个项目的数组

$computer,$Speed,$Regcheck
FYKJ
100
YES
vs.由逗号分隔的三个项目的串联

$computer + "," + $Speed + "," + $Regcheck
FYKJ,100,YES

$computer、$Speed、$Regcheck
将创建一个数组,并运行
文件
每个变量一个=它们得到单独的行。如果首先使用变量构造单个字符串,它将显示一行。像这样:

"$computer,$Speed,$Regcheck" | out-file -filepath C:\temp\scripts\pshell\dump.txt -append -width 200

您可以使用PowerShell的`-join'运算符将值数组连接在一起。以下是一个例子:

$FilePath = '{0}\temp\scripts\pshell\dump.txt' -f $env:SystemDrive;

$Computer = 'pc1';
$Speed = 9001;
$RegCheck = $true;

$Computer,$Speed,$RegCheck -join ',' | Out-File -FilePath $FilePath -Append -Width 200;
输出

pc1,9001,True

我在谷歌搜索中处于领先地位。为了表示诚意,我加入了我从这段代码和我收集的其他代码的部分拼凑而成的内容

#如果您的属性或属性跨越多个commandlet,则此脚本非常有用
#并且您希望导出某个数据集,但您希望导出的所有属性都不是
#仅包含在一个commandlet中,因此必须使用多个commandlet导出所需的数据集
#
#创建日期:Joshua Biddle 2017年8月24日
#编辑:Joshua Biddle 2017年8月24日
#
$A=获取ADGroupMember“YourGroupName”
#构造用于数据导出的输出数组
$Results=@()
foreach(美元中的B)
{
#构造一个对象
$myobj=Get ADuser$B.samAccountName-Properties脚本路径,办公室
#填充对象
$Properties=@{
samAccountName=$myobj.samAccountName
Name=$myobj.Name
办公室=$myobj.Office
ScriptPath=$myobj.ScriptPath
}
#将对象添加到out数组中
$Results+=新对象psobject-属性$Properties
#擦拭物体以确保其安全
$myobj=$null
}
#循环完成后,将阵列导出为CSV

$Results |选择“samAccountName”、“Name”、“Office”、“ScriptPath”|导出CSV“C:\Temp\YourData.CSV”
当我运行此命令时,$computer是否显示有计算机名?它在CSV中显示为“System.DirectoryServices.PropertyValueCollection”好的,我不知道$computer变量是在哪里生成的,但是您所引用的类有一个ToString方法,所以您可以这样做:$myobj.computer=$computer.ToString()。如果这不起作用,我需要知道你在$computer变量中到底放了什么。这起作用了!谢谢仅供参考…计算机变量直接从AD中提取-太棒了!我猜out文件执行隐式字符串转换,而export csv不执行。无论如何,这种技术将允许您对数据进行切片和骰子分割,而且更“面向对象”,因此,这是一种“正确”的做事方式(至少在我的头脑中:-),这应该是公认的答案。它干净简单。我打赌大多数人都忽略了这样一个事实,即包装变量的双引号才是关键所在。问题是这个输出是作为CSV的,而请求是作为平面文件的,而不是CSV。这对我来说很有效,但我必须在连接字符串周围使用双引号。","