2017-09-26 69 views
2

我想寫查詢MySQL數據庫,存儲結果,然後PowerShell腳本的foreach循環對象執行的每一行命令。在這種情況下,它最終會通過電子郵件發送報告,但在我到達那裏之前出現了這個問題。在一個MySQL數據表的第一行空白

表似乎罰款存儲,以及一個極其簡單的foreach循環對象返回我的期望,但是當我試圖使循環更加複雜的第一行是空的。雖然我可以在這個特定的案例中解決它,但我試圖理解它爲什麼會發生並且短缺。

下面是建立查詢(從https://vwiki.co.uk/MySQL_and_PowerShell拍攝)功能:

function Execute-MySQLQuery([string]$query) { 

    $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $conn) # Create SQL command 
    $dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)  # Create data adapter from query command 
    $dataSet = New-Object System.Data.DataSet         # Create dataset 
    $dataAdapter.Fill($dataSet, "data")           # Fill dataset from data adapter, with name "data"    
    $cmd.Dispose() 
    return $dataSet.Tables["data"]            # Returns an array of results 
} 

這就是這裏所說:

# Connect to MySQL Database 
$conn = Connect-MySQL $user $pass $MySQLHost $database $certfile $certpass 

$query = "SELECT * FROM reports;" 
$result = Execute-MySQLQuery $query 

$result | Format-Table 

並返回此正是:

PS C:\Users\redacted> C:\Users\redacted\Desktop\tmp\testsql.ps1 
5 

rep_id email_add1   user   sent_success 
------ ----------   ----   ------------ 
    1 [email protected] Jim Johnson    1 
    2 [email protected]  John Doe     1 
    3 [email protected] Stacy Something   0 
    4 [email protected] Willy Gates    1 
    5 [email protected] Paul Allen     0 

然而當我嘗試在ForEach-Object循環中僅使用這一列時,我得到一個空白l國家統計局。出於測試目的,我嘗試了很基本的:

$result | ForEach-Object {$_.user} 

哪個返回預期:

PS C:\Users\redacted> C:\Users\redacted\Desktop\tmp\testsql.ps1 
Jim Johnson 
John Doe 
Stacy Something 
Willy Gates 
Paul Allen 

但只要我變得更加複雜比:

$result | ForEach-Object {"Howdy $($_.user)!"} 

我得到:

PS C:\Users\redacted> C:\Users\redacted\Desktop\tmp\testsql.ps1 
Howdy ! 
Howdy Jim Johnson! 
Howdy John Doe! 
Howdy Stacy Something! 
Howdy Willy Gates! 
Howdy Paul Allen! 

我失去了舒美特興奮明顯?我(顯然)仍然在學習,但我發現這個問題比其他人更難。也許我只是使用了錯誤的條款,但我真的很感謝任何能指引我朝着正確方向的人。謝謝。

+0

'[空] $ DataAdapter.Fill方法($數據集 「數據」)' – PetSerAl

回答

1

在腳本塊(如函數體)中生成的每個值都將成爲函數結果的一部分,除非存儲在變量中或顯式丟棄。

此功能有三個輸出值(嘗試):

function foo { 
    1 
    2 
    3 
} 

foo | foreach { "I received $_" } 

注意的是,使用return是不必要的。所有返回都會終止該功能。另請注意,foreach正文沒有return聲明,但仍產生三個值。

許多功能輸出值,你真的不關心。無論如何,這些值必須在Powershell中處理。如果你想從你的函數的輸出消除它們,無論它們或者將它們存儲到Out-Null

function Execute-MySQLQuery { 
    param(
     [MySql.Data.MySqlClient.MySqlConnection]$connection, 
     [string]$query 
    ) 
    $cmd = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $conn) 
    $dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd) 
    $dataSet = New-Object System.Data.DataSet 
    $dataAdapter.Fill($dataSet, "data") | Out-Null 
    $cmd.Dispose() 
    $dataSet.Tables["data"] 
} 

$conn = Connect-MySQL $user $pass $MySQLHost $database $certfile $certpass 

$result = Execute-MySQLQuery -connection $conn -query "SELECT * FROM reports;" 
$result | Format-Table 

在函數的最後一行所產生的價值是不存儲,它不被丟棄。因此它成爲函數返回的一部分。

+0

我明白了!像管道到/ dev/null。謝謝,那完美的作品。看起來多餘的線路來自Fill命令,但我在PowerShell文檔中找不到太多內容,是從.NET開始的? – RobertRSeattle

+0

是的,這是.NET函數的返回值。 '.Fill()'返回填充的記錄數,我想。但它的工作原理與所有產生價值的東西一樣,無論是Powershell計算,.NET函數,cmdlet還是普通的基於文本的命令行工具 - 都很注意,很容易忽略。你不必寫'| Out-Null'後面的*每個*語句,但是如果有疑問請查看文檔。 – Tomalak

相關問題