3日編輯:爲什麼讓在PowerShell腳本的差別到底這回?
以下兩個腳本之間唯一的區別(除了函數的名字)是事實,第二不通過明確的返回返回結果。但他們表現不同。第一條顯示兩行
abc
efg
在網格
,而第二節目在網格空行。
Skript 1:
ipmo WPK
$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString
$conn.Open()
function Invoke-sql1
{
param([string]$sql,
[System.Data.SQLClient.SQLConnection]$connection
)
$cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
$ds = New-Object system.Data.DataSet
$da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
$da.fill($ds) | Out-Null
return $ds.tables[0]
}
function Show-Bockmarks ($conn) {
New-ListView -Name ListView -View {
New-GridView -AllowsColumnReorder -Columns {
New-GridViewColumn "title"
}
} -show -On_Loaded {
$ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@
$TableView = $window | Get-ChildControl ListView
$TableView.ItemsSource = @(Invoke-sql1 -sql $ff_sql -connection $conn)
}
}
Show-Bockmarks $conn
腳本2:
ipmo WPK
$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString
$conn.Open()
function Invoke-sql2
{
param([string]$sql,
[System.Data.SQLClient.SQLConnection]$connection
)
$cmd = new-object System.Data.SQLClient.SQLCommand($sql,$connection)
$ds = New-Object system.Data.DataSet
$da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
$da.fill($ds) | Out-Null
$ds.tables[0]
}
function Show-Bockmarks ($conn) {
New-ListView -Name ListView -View {
New-GridView -AllowsColumnReorder -Columns {
New-GridViewColumn "title"
}
} -show -On_Loaded {
$ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@
$TableView = $window | Get-ChildControl ListView
$TableView.ItemsSource = @(Invoke-sql2 -sql $ff_sql -connection $conn)
}
}
Show-Bockmarks $conn
第一個腳本示出了在格柵2點的行,而第二顯示到網格中的空行。 第二行爲似乎與此類似
3腳本沒有使用功能:在這裏沒有使用功能的
ipmo WPK
$ConnectionString = $ConnectionString = "Server=localhost;Integrated Security=True"
$conn = new-object System.Data.SQLClient.SQLConnection
$conn.ConnectionString = $ConnectionString
$conn.Open()
$ff_sql = @"
SELECT 'abc' title
UNION
SELECT 'efg' title
"@
function Show-Bockmarks ($conn) {
New-ListView -Name ListView -View {
New-GridView -AllowsColumnReorder -Columns {
New-GridViewColumn "title"
}
} -show -On_Loaded {
$TableView = $window | Get-ChildControl ListView
$cmd = new-object System.Data.SQLClient.SQLCommand($ff_sql,$conn)
$ds = New-Object system.Data.DataSet
$da = New-Object System.Data.SQLClient.SQLDataAdapter($cmd)
$da.fill($ds) | Out-Null
$TableView.ItemsSource = @($ds.tables[0].rows)
}
}
Show-Bockmarks $conn
注意,我必須明確地使用$ ds.tables [0] 。行。否則,我得到的錯誤
Exception setting "ItemsSource": "Cannot convert the "Table"
value of type "System.Data.DataTable"
to type "System.Collections.IEnumerable"."
PowerShell function won't return object或許可以解釋,爲什麼這種行爲類似功能,無需回報。但是,回報如何使2行顯示在網格中?
原帖:
的功能調用,SQLite和調用,sqlite1幾乎相同。
唯一的區別是,調用-sqlite的使用明確的回報。 的區別是非常微妙的,當我執行
$o1 = Invoke-sqlite $sql $conn
$o2 = Invoke-sqlite2 $sql $conn
我看不出有什麼區別。但是,在下面的腳本的完整背景下,與調用-sqlite的網格填充數據和調用-sqlite的網格填充空行。
BTW:該腳本的目的是爲1到3個關鍵字組合的書籤搜索firefox places.sqlite歷史數據庫的副本。您必須修改爲DLL線5的路徑和SQLite數據庫行路8
如果你有問題System.Data.SQLite.dll看到this
ipmo WPK
if (! $sqlitedll)
{
$sqlitedll = [System.Reflection.Assembly]::LoadFrom("C:\Program Files\System.Data.SQLite\bin\System.Data.SQLite.dll")
}
$ConnectionString = "Data Source=C:\Var\sqlite_ff4\places.sqlite"
$conn = new-object System.Data.SQLite.SQLiteConnection
$conn.ConnectionString = $ConnectionString
$conn.Open()
# $sql = "SELECT * from moz_bookmarks t1 where parent = 4 and t1.title = 'sqlite' or t1.title = 'sql'"
function Invoke-sqlite
{
param([string]$sql,
[System.Data.SQLite.SQLiteConnection]$connection
)
$cmd = new-object System.Data.SQLite.SQLiteCommand($sql,$connection)
$ds = New-Object system.Data.DataSet
$da = New-Object System.Data.SQLite.SQLiteDataAdapter($cmd)
$da.fill($ds) | Out-Null
return $ds.tables[0]
}
function Invoke-sqlite2
{
param([string]$sql,
[System.Data.SQLite.SQLiteConnection]$connection
)
$cmd = new-object System.Data.SQLite.SQLiteCommand($sql,$connection)
$ds = New-Object system.Data.DataSet
$da = New-Object System.Data.SQLite.SQLiteDataAdapter($cmd)
$da.fill($ds) | Out-Null
$ds.tables[0]
}
# $o1 = Invoke-sqlite $sql $conn
# $o2 = Invoke-sqlite2 $sql $conn
function Show-Bockmarks ($resource) {
#New-StackPanel -Orientation vertical {
New-Grid -Rows 2 -Columns 1 -width 1400 -hight 1000 {
New-StackPanel -Orientation horizontal -column 0 -row 0 -Children {
New-Label '1. Keyword'
New-TextBox -Name tag1 -width 200
New-Label '2. Keyword'
New-TextBox -Name tag2 -width 200
New-Label '3. Keyword'
New-TextBox -Name tag3 -width 200
New-Button -Name Search "search" -On_Click {
$text1 = $window | Get-ChildControl Tag1
$tag1 = $text1.Text
$text2 = $window | Get-ChildControl Tag2
$tag2 = $text2.Text
$text3 = $window | Get-ChildControl Tag3
$tag3 = $text3.Text
if ($tag2 -ne '') {
$clause2 = @"
join moz_bookmarks l2 on b.fk = l2.fk and b.id <> l2.id
join moz_bookmarks t2 on l2.parent = t2.id and t2.parent = 4 and upper(t2.title) = upper('$tag2')
"@
} else { $clause2 = '' }
if ($tag3 -ne '') {
$clause3 = @"
join moz_bookmarks l3 on b.fk = l3.fk and b.id <> l3.id
join moz_bookmarks t3 on l3.parent = t3.id and t3.parent = 4 and upper(t3.title) = upper('$tag3')
"@
} else { $clause3 = '' }
$ff_sql = @"
SELECT b.title, datetime (b.dateAdded/1000000, 'unixepoch', 'localtime') dateAdded , p.url
from moz_bookmarks b
join moz_bookmarks l1 on b.fk = l1.fk and b.id <> l1.id
join moz_bookmarks t1 on l1.parent = t1.id and t1.parent = 4 and upper(t1.title) = upper('$tag1')
join moz_places p on b.fk = p.id $clause2 $clause3
where b.title is not null and b.type = 1
"@
# $query = $window | Get-ChildControl query
# $query.text = $ff_sql
$conn = $resource.conn
$window.Title = "$($conn.database) Database Browser"
$TableView = $window | Get-ChildControl TableView
$TableView.ItemsSource = Invoke-sqlite -sql $ff_sql -connection $conn
}
# New-textbox -Name query
New-Button -Name Cancel "Close" -On_Click {$window.Close()}
}
# -VerticalScrollBar $True
# New-ScrollViewer {
New-ListView -Column 0 -Row 1 -Name TableView -View {
New-GridView -AllowsColumnReorder -Columns {
New-GridViewColumn "title"
New-GridViewColumn "dateAdded"
New-GridViewColumn "url"
}
} -On_SelectionChanged {
start $this.selecteditem.url
}
#}
} -asjob -Resource $resource
}
Show-Bockmarks -resource @{conn = $conn}
同一陣列我沒有看到使用SQLite任兩個結果之間的差。只有在WPK的背景下,差異鞋。我使用System.Data.SQLClient重寫了我的腳本。與WPK的背景差異仍然存在。 – 2011-04-27 07:12:16