尝试将SQL查询中的数据集写入Powershell中的CSV文件

尝试将SQL查询中的数据集写入Powershell中的CSV文件,powershell,Powershell,我想从我所做的SQL查询创建一个CSV文件(如果可能的话,没有标题)。我的动力壳在下面。它读取DB没问题,我看到行结果从printint返回到stdout。但我似乎不知道如何将结果放入CSV文件中 从我的powershell创建的txt文件只有一行: 键入System.Int32 在我看来,这就像是输出数据类型之类的东西。看起来很奇怪,它是32,但可能是因为它是指向对象的指针 我看到一篇文章在使用数据集时使用了表[0],但当我将最后一行替换为 $QueryResults.Tables[0]|导出

我想从我所做的SQL查询创建一个CSV文件(如果可能的话,没有标题)。我的动力壳在下面。它读取DB没问题,我看到行结果从printint返回到stdout。但我似乎不知道如何将结果放入CSV文件中

从我的powershell创建的txt文件只有一行:

键入System.Int32 在我看来,这就像是输出数据类型之类的东西。看起来很奇怪,它是32,但可能是因为它是指向对象的指针

我看到一篇文章在使用数据集时使用了表[0],但当我将最后一行替换为 $QueryResults.Tables[0]|导出csv c:\tests.txt 它给了我一个错误,说它无法将参数绑定到参数,因为它为null

function Get-DatabaseData {
param (
    [string]$connectionString,
    [string]$query,
    [switch]$isSQLServer
)
if ($isSQLServer) {
    Write-Verbose 'in SQL Server mode'
    $connection = New-Object -TypeName System.Data.SqlClient.SqlConnection
} else {
    Write-Verbose 'in OleDB mode'
    $connection = New-Object -TypeName System.Data.OleDb.OleDbConnection
}
$connection.ConnectionString = $connectionString
$command = $connection.CreateCommand()
$command.CommandText = $query
if ($isSQLServer) {
    $adapter = New-Object -TypeName System.Data.SqlClient.SqlDataAdapter $command
} else {
    $adapter = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $command
}
$dataset = New-Object -TypeName System.Data.DataSet
$adapter.Fill($dataset)
$dataset.Tables[0]
}

$QueryResults = Get-DatabaseData -verbose -connectionString 'Server=localhost\SQLEXPRESS;;uid=sa; pwd=Mypwd;Database=DanTest;Integrated Security=False;' -isSQLServer -query "SELECT * FROM Computers"
foreach($MyRow in $QueryResults) {
write-output $MyRow.computer
write-output $MyRow.osversion
}

$QueryResults | export-csv c:\tests.txt
我添加了一行将$QueryResults打印到stdout,下面是控制台中的输出以及写入表单for循环,以显示我的$QueryResults所具有的功能

5


computer         : localhost
osversion        :
biosserial       :
osarchitecture   :
procarchitecture :

computer         : localhost
osversion        :
biosserial       :
osarchitecture   :
procarchitecture :

computer         : not-online
osversion        :
biosserial       :
osarchitecture   :
procarchitecture :

computer         :
osversion        : win8
biosserial       :
osarchitecture   :
procarchitecture :

computer         : dano
osversion        : win8
biosserial       :
osarchitecture   :
procarchitecture :

localhost

localhost

not-online


win8
dano
win8 

如果只需要CSV文件中的数据,请将
-NoTypeInformation
开关传递到
导出CSV
您可能会遇到循环问题,因为您的
$QueryResults
可能不包含您要查找的数据。在控制台中,
$QueryResults
看起来像什么?一旦你解决了这个问题,它应该为你处理好输出

默认情况下,CSV文件的第一行包含“#TYPE”,后跟对象类型的完全限定名

要绕过这一点,您只需使用Alroc建议的
-NoTypeInformation
开关即可。但是,您还提到了删除标头,这将需要一种不同的方法

$QueryResults | ConvertTo-CSV -NoTypeInformation | Select-Object -Skip 1 | Set-Content "c:\tests.txt"
或者有点不同的结果

$QueryResults | ConvertTo-CSV | Select -Skip 2 | Set-Content "c:\tests.txt"
$QueryResults
转换为csv对象。但是,您选择忽略包含类型信息和标题/标题行的行。在那一点上除了数据什么都没有

讨论更新

converttocsv
Export CSV
没有显示预期的数据,但除了类型信息之外什么也没有显示。一开始我并没有注意到,
$QueryResults
的输出包含了第一行,它只是数字5。大概是结果数据集中的记录。如果跳过
$QueryResults
的第一条记录,则只剩下所需的数据。也许最好研究一下第一行出现的原因(也许有一种方法可以压制它)。就目前的问题而言,我们的解决方法如下。第一个跳过是忽略“5”行,第二个跳过是从csv输出中删除标题

$QueryResults | Select -Skip 1 | Convert-ToCSV -NoTypeInformation | Select-Object -Skip 1 | Set-Content "c:\tests.txt"

谢谢各位。我在原来的问题中添加了$QueryResults到Console的输出以及我打印计算机和osversion值的for循环的输出。也许我不明白通过for的每个循环中$MyRow值中应该包含什么。我以为数据集中的每一条记录都是这样,然后我希望我的写入输出打印计算机,然后再打印每一行的osversion。但在我得到的输出中,它首先打印所有三个计算机值,然后打印所有3个OSVersions。我发现我对$MyRow值的误解。看起来它不是我在foreach循环中得到的一行,而是数据集第一列中的所有值。所以我添加了foreach块来打印到stdout。e、 g.foreach($MyRow.computer中的aRow){$aRow}给出了所有的计算机名。Matt我尝试了你的第一个转换建议,但它没有像我调用导出csv时那样写入文件c:\tests.txt。我的代码所写的不是我想要的,但文件确实存在。@user461051
$QueryResults | ConvertTo CSV-NoTypeInformation
的输出是什么?