2016-01-09 58 views
0

我使用C/C++,Java,C#等多種語言進行黑客攻擊。 Powershell只是一個新名單。所以有時我會因爲簡單的事情而失明......我得到了類型轉換的錯誤,並且看不出原因......我嘗試強制輸入ps腳本,但是我做錯了什麼。這兩個功能我已經寫:使用函數進行類型轉換

function Get-DBConnection 
{ 
[CmdletBinding()] 
[OutputType([Npgsql.NpgsqlConnection])] 
param 
(
    [Parameter(Mandatory = $true, 
       Position = 1)] 
    [String]$DBServer, 
    [Parameter(Mandatory = $true, 
       Position = 2)] 
    [int]$DBPort, 
    [Parameter(Mandatory = $true, 
       Position = 3)] 
    [string]$DatabaseName, 
    [Parameter(Mandatory = $true, 
       Position = 4)] 
    [string]$UserName, 
    [Parameter(Mandatory = $true, 
       Position = 5)] 
    [string]$Password 
) 

$DBConnectionString = "server=$MyDBServer;port=$MyDBPort;user id=$MyUid;password=$MyPwd;database=$MyDatabase;pooling=false" 
$DBConn = New-Object -TypeName Npgsql.NpgsqlConnection; 
$DBConn.ConnectionString = $DBConnectionString 
$DBConn.Open 

return $DBConn 
} 

function execute-Query 
{ 
[CmdletBinding()] 
[OutputType([System.Data.DataSet])] 
param 
(
    [Parameter(Mandatory = $true)] 
    [Npgsql.NpgsqlConnection]$DBConnection, 
    [Parameter(Mandatory = $true)] 
    [string]$Query 
) 

$DBCmd = $DBConnection.CreateCommand() 
$DBCmd.CommandText = $Query 
$adapter = New-Object -TypeName Npgsql.NpgsqlDataAdapter $DBCmd 
$dataset = New-Object -TypeName System.Data.DataSet 
$adapter.Fill($dataset) 

return $dataset 
} 

現在,在我的劇本我試着打電話給他們如下:

$MyDBConnection = New-Object -TypeName Npgsql.NpgsqlConnection 
$MyResultset = New-Object -TypeName System.Data.DataSet 
$query = "SELECT * FROM test_table1;" 

$MyDBConnection = Get-DBConnection "servername" 5432 "dbname" "username" "pass" 

當通過與調試器,可變$ MyDBConnection類型的腳本步進更改爲對象[]調用Get-DBConnection後! 我做不是瞭解這裏發生了什麼。

爲A(邏輯)後果調用

$MyResultset = execute-Query $MyDBConnection $query 

時說,放慢參數DBConnection的(在該函數的名字......)不能從System.Object的[轉換我得到一個類型轉換錯誤]Npgsql.NpgsqlConnection

任何幫助和解釋這裏有什麼問題是非常感謝。

+0

'$ DBConn.Open' - >'$ DBConn.Open()' – PetSerAl

+0

不能,它返回:使用0參數調用open時的異常。該幫助沒有顯示出我的觀點。此方法來自.NET postgres數據提供程序驅動程序.... – ThommyB

+0

然後,您必須閱讀該異常消息,瞭解它並消除異常的原因。但是你必須調用'Open'方法,否則連接就無法使用。 – PetSerAl

回答

0

使用PowerShell,您不必「明確地」返回任何東西。任何發送到管道的內容都是「返回」的。很可能你有兩個不同的調用都發送到管道,PowerShell會自動將其轉換爲一組對象。我的猜測是$ DBConn.Open發出一個管道對象,然後你也「返回」$ DBConn。

在最後一行中,請注意不要使用return語句。通過在一條線上簡單地輸入一個變量,它將被髮送到管道。

此外,你的困惑的關鍵是PowerShell使用管道,而不是在其他語言如C,C++或C#中返回。研究管道原因這是編寫PowerShell函數的正確方法

+0

有趣。返回似乎是可選的。請參閱「Get-Help about_Return」。原因是不同的(參見上面的評論)。但有一個問題:我習慣於通過在名稱中添加禁忌來區分屬性和方法。所以object.open()是一個方法,object.open是一個屬性。這在PS中也是如此,對嗎? – ThommyB

+0

是的,一般來說這是真的。雖然記住在那個級別上,你正在與.NET對象交互,所以對它們來說,任何東西都適用於Powershell。屬性可以調用底層的訪問器方法,所以你可能會調用get()或set()方法暴露的方法,而不是類似於C# –