powershell 启动GUI
这年头编写一个GUI软件已经可以只用控制台脚本了(当然这依托于.NET框架)。
导入了sqlite.dll库,DB使用SQLITE,GUI用WPF画的,这样可以用Visual Studio的WPF设计器绘制,完成以后直接将XAML贴上来,然后动作在powershell里写,为控件添加点击事件。
using namespace System.Xml
Add-Type -AssemblyName PresentationFramework
[Reflection.Assembly]::LoadFile("C:\Program Files\sqlite-netFx46-binary-x64-2015-1.0.118.0\System.Data.SQLite.dll")
#region SQLITE CONNECT
$databasePath = "C:\Devs\bash\TODOv3.sqlite3"
$dbConnectionString = "Data Source=$databasePath;Version=3;"
$Global:connection = New-Object System.Data.SQLite.SQLiteConnection($dbConnectionString)
#endregion
#region DESIGNER
[xml]$xaml = '
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="476" Width="800">
<Grid>
<TabControl Margin="10,10,460,21">
<TabItem Header="TabItem">
<Grid x:Name="taskListPanel" Background="#FFE5E5E5">
</Grid>
</TabItem>
<TabItem Header="TabItem">
</TabItem>
</TabControl>
<Label x:Name="title1" Content="Label" HorizontalAlignment="Right" Margin="0,33,10,0" Width="432" Background="#FFC1FFED" Height="77" VerticalAlignment="Top" />
<Label x:Name="content1" Content="Content" HorizontalAlignment="Right" Margin="0,148,10,21" Width="432" Background="#FFE3FFAD"/>
</Grid>
</Window>
'
[xml]$ucxaml = '
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Page1">
<Grid Height="55" Margin="8,17,8,0" VerticalAlignment="Top" Background="White">
<Label x:Name="lb1" Content="Label 1" Height="35" Margin="10,0,10,0" VerticalAlignment="Center"/>
</Grid>
</UserControl> '
$window = [Windows.Markup.XamlReader]::Load((New-Object XmlNodeReader $xaml))
$taskNode =[Windows.Markup.XamlReader]::Load((New-Object XmlNodeReader $ucxaml))
#endregion
#region INIT
$connection.Open()
$command = $connection.CreateCommand()
$allTaskRead = "SELECT tid,title,uid,mtid FROM task"
$command = New-Object System.Data.SQLite.SQLiteCommand($allTaskRead, $connection)
$result = $command.ExecuteReader()
$Global:gridMain = $window.FindName("taskListPanel")
$taskNodeList = @()
while($result.Read()){
$t1 = [Windows.Markup.XamlReader]::Load((New-Object XmlNodeReader $ucxaml))
$t1.Tag = $result["tid"]
$t1.add_MouseLeftButtonUp({ readDetail($this.Tag) })
$taskNodeList += $t1
}
foreach($gNode in $taskNodeList) {
$gridMain.AddChild($gNode)
}
$connection.Close()
#endregion
#region ACTION
function readDetail($tid)
{
$connection.Open()
$query = ("SELECT task.tid,sid,stime FROM task LEFT JOIN status ON task.tid=status.tid WHERE task.tid = ",$tid,"ORDER BY stime", -join ' ')
$command = New-Object System.Data.SQLite.SQLiteCommand($query, $connection)
$reader = $command.ExecuteReader()
$txtDetail.Content =""
while($reader.Read()){
$txtDetail.Content = ( $txtDetail.Content,$reader["sid"],$reader["stime"] -join '
')
}
$connection.Close()
}
$txtTitle = $window.FindName("title1")
$txtDetail = $window.FindName("content1")
#endregion
$window.ShowDialog()
DB设计
CREATE TABLE meta(
"k" TEXT NOT NULL
, "v" TEXT NOT NULL
, PRIMARY KEY ("k")
);
CREATE TABLE status(
"sid" INT NOT NULL
, "tid" INT NOT NULL
, "mtid" TEXT NOT NULL
, "msg" TEXT
, "stime" TEXT NOT NULL
, PRIMARY KEY ("sid")
);
CREATE TABLE task(
"tid" INT NOT NULL
, "title" TEXT NOT NULL
, "uid" INT
, "mtid" TEXT NOT NULL
, PRIMARY KEY ("tid")
);
CREATE TABLE user (
"uid" TEXT NOT NULL
, "name" TEXT NOT NULL
, PRIMARY KEY ("uid")
);