为数组的每个noteproperty添加周围的双引号(我认为)

时间:2017-02-27 00:18:15

标签: arrays sqlite powershell

我真的没有运气这么多借口我缺乏失败的代码示例。

我有一个数组,我将传递给使用SQLite模块作为psdrive安装的SQLite数据库。目标表(db:\ events)是使用以下命令和定义创建的:

mount-sqlite -name dbRAM -dataSource :memory:
Invoke-Item dbRAM: -sql 'CREATE TABLE event (timestamp DATETIME PRIMARY KEY NOT NULL,event NOT NULL,data3 TEXT,data4 TEXT,data5 TEXT,data6 TEXT,data7 TEXT,data8 TEXT,data9 TEXT);'

这创建了以下子项:

PS dbRAM:\> gci


SSItemMode       : d+~<     i
PSPath           : CodeOwls.PowerShell.SQLite.Provider\SQLite::[Data Source=:memory:]\event
PSParentPath     : CodeOwls.PowerShell.SQLite.Provider\SQLite::[Data Source=:memory:]
PSChildName      : event
PSDrive          : dbRAM
PSProvider       : CodeOwls.PowerShell.SQLite.Provider\SQLite
PSIsContainer    : True
TABLE_CATALOG    : main
TABLE_SCHEMA     : 
TABLE_NAME       : event
TABLE_TYPE       : table
TABLE_ID         : 1
TABLE_ROOTPAGE   : 2
TABLE_DEFINITION : CREATE TABLE event (timestamp DATETIME PRIMARY KEY NOT NULL,event NOT NULL,data3 TEXT,data4 TEXT,data5 TEXT,data6 TEXT,data7 TEXT,data8 TEXT,data9 TEXT)
RowError         : 
RowState         : Unchanged
Table            : {event}
ItemArray        : {main, , event, table...}
HasErrors        : False

我有一个通过Convertfrom-Json创建的阵列来自本世纪最好的游戏,名为Elite:Dangerous。但问题是只有几个sql列我可以实际预测其名称。这些是时间戳和事件属性名称。这是我的数组的一个例子:

PS dbRAM:\> $EliteEvent |gm


   TypeName: System.Management.Automation.PSCustomObject

Name                        MemberType   Definition                                    
----                        ----------   ----------                                    
Equals                      Method       bool Equals(System.Object obj)                
GetHashCode                 Method       int GetHashCode()                             
GetType                     Method       type GetType()                                
ToString                    Method       string ToString()                             
event                       NoteProperty string event=Docked                           
StarSystem                  NoteProperty string StarSystem=Laksak                      
StationEconomy              NoteProperty string StationEconomy=$economy_Colony;        
StationEconomy_Localised    NoteProperty string StationEconomy_Localised=Colony        
StationFaction              NoteProperty string StationFaction=Lei Cheung              
StationGovernment           NoteProperty string StationGovernment=$government_Engineer;
StationGovernment_Localised NoteProperty string StationGovernment_Localised=Workshop   
StationName                 NoteProperty string StationName=Trader's Rest              
timestamp                   NoteProperty string timestamp=2017-02-26 04:07:54  

我可以看到2个问题,以下错误消息将支持这一点。第一个是值周围没有引号,所以我需要找到一种在数组中的每个值周围添加引号的方法,如https://psqlite.codeplex.com/wikipage?title=Creating%20Records&referringTitle=Documentation所述

如果我尝试将此数组复制到sql,则会出现以下错误:

PS dbRAM:\> new-item -path dbRAM:\event $EliteEvent
New-Item : A positional parameter cannot be found that accepts argument '@{timestamp=2017-02-26 04:07:54; event=Docked; StationName=Trader's Rest; StarSystem=Laksak; StationFaction=Lei Cheung; 
StationGovernment=$government_Engineer;; StationGovernment_Localised=Workshop; StationEconomy=$economy_Colony;; StationEconomy_Localised=Colony}'.
At line:1 char:1
+ new-item -path dbRAM:\event $EliteEvent
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Item], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand

第二个巨大的主要问题是我只想将属性值放入我的属性data3到data9,但我永远不知道数组中不同属性的名称是什么。每种事件类型都会生成自己的数据集,这些类型之间唯一的共同点是时间戳和事件类型。我怎么能通过new-item cmdlet中使用的数组按顺序将名称未知属性填充到我的SQL中?

如果您想知道失去属性名称的重点是什么,我将从数据库中取出数据并通过检测事件类型的代码处理其他属性,然后根据与之关联的固定格式处理数据那种类型。

我真的在试图解决这个问题,我希望有人可以提供帮助。

这真的太过于无法实现吗?

最诚挚的问候!

** *****编辑

我想到为每种类型的事件创建一个不同的表定义并分别处理它们意味着什么,所以我创建了一个完全符合数组属性名称的表:

PS dbRAM:\> Invoke-Item dbRAM: -sql 'CREATE TABLE event_docked (timestamp DATETIME PRIMARY KEY NOT NULL,event TEXT NOT NULL,StarSystem TEXT,StationEconomy TEXT,StationEconomy_Localised TEXT,StationFaction TEXT, StationGovernment TEXT,StationGovernment_Localised TEXT,StationName TEXT);'

同样的问题是持久的:

PS dbRAM:\> new-item -path dbRAM:\event_docked $EliteEvent
New-Item : A positional parameter cannot be found that accepts argument '@{timestamp=2017-02-26 04:07:54; event=Docked; StationName=Trader's Rest; StarSystem=Laksak; StationFaction=Lei Cheung; StationGovernment=$government_Engineer;; StationGovernment_Localised=Workshop; StationEconomy=$economy_Colony;; StationEconomy_Localised=Colony}'.
At line:1 char:1
+ new-item -path dbRAM:\event_docked $EliteEvent
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-Item], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewItemCommand

****编辑**关于Mathias R. Jessen的建议的额外信息

PS dbRAM:\> $EliteEvent | New-Item -Path dbRAM:\event_docked
New-Item : Sequence contains no elements
At line:1 char:15
+ $EliteEvent | New-Item -Path dbRAM:\event_docked
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ([Data Source=:memory:]\event_docked:String) [New-Item], InvalidOperationException
    + FullyQualifiedErrorId : NewItem.Invoke,Microsoft.PowerShell.Commands.NewItemCommand


PS dbRAM:\> $EliteEvent


timestamp                   : 2017-02-26 04:07:54
event                       : Docked
StationName                 : Trader's Rest
StarSystem                  : Laksak
StationFaction              : Lei Cheung
StationGovernment           : $government_Engineer;
StationGovernment_Localised : Workshop
StationEconomy              : $economy_Colony;
StationEconomy_Localised    : Colony

****编辑**以回应下面的建议的额外信息:

$JournalPath = "\\AORUS_X7\EliteDangerousLogs"
import-module sqlite
New-PSDrive -Name Journal -PSProvider FileSystem -Root $JournalPath
function Get-EliteEvent
    {
      $Event = convertfrom-json (Get-ChildItem -Path $JournalPath -Recurse | Sort-Object -Property LastWriteTime | Select-Object -last 1 | select-object $_.fullname | get-content | select-object -last 1)
      $Event.timestamp = $Event.timestamp.Replace('T', ' ')
      $Event.timestamp = $Event.timestamp.TrimEnd('Z')
      return $Event
    }

mount-sqlite -name dbRAM -dataSource :memory:
Invoke-Item dbRAM: -sql 'CREATE TABLE event_docked (timestamp DATETIME PRIMARY KEY NOT NULL,event TEXT NOT NULL,StarSystem TEXT,StationEconomy TEXT,StationEconomy_Localised TEXT,StationFaction TEXT, StationGovernment TEXT,StationGovernment_Localised TEXT,StationName TEXT);'

$EliteEvent = Get-EliteEvent
上面的

是脚本化的 - 然后我在提示符下运行以下命令:

PS dbRAM:\> $EliteEvent | New-Item -Path dbRAM:\event_docked
New-Item : Sequence contains no elements
At line:1 char:15
+ $EliteEvent | New-Item -Path dbRAM:\event_docked
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ([Data Source=:memory:]\event_docked:String) [New-Item], InvalidOperationException
    + FullyQualifiedErrorId : NewItem.Invoke,Microsoft.PowerShell.Commands.NewItemCommand


PS dbRAM:\> $EliteEvent


timestamp                   : 2017-02-26 04:07:54
event                       : Docked
StationName                 : Trader's Rest
StarSystem                  : Laksak
StationFaction              : Lei Cheung
StationGovernment           : $government_Engineer;
StationGovernment_Localised : Workshop
StationEconomy              : $economy_Colony;
StationEconomy_Localised    : Colony

有一个充满json文件的目录,上面的函数从最后一个文件开始。这是命令行上函数的命令输出(没有convertfrom-json)

PS C:\Users\Stuart\Desktop\Amy-EVA2_git (master ≡)
$ Get-ChildItem -Path $JournalPath -Recurse | Sort-Object -Property LastWriteTime | Select-Object -last 1 | select-object $_.fullname | get-content | select-object -last 1
{ "timestamp":"2017-02-26T04:07:54Z", "event":"Docked", "StationName":"Trader's Rest", "StarSystem":"Laksak", "StationFaction":"Lei Cheung", "StationGovernment":"$government_Engineer; ", "StationGovernment_Localised":"Workshop", "StationEconomy":"$economy_Colony;", "StationEconomy_Localised":"Colony" }

但是......不知何故,我刚刚检查过,这次数组管道到新项目的命令结构已经工作了,尽管错误说序列不包含任何元素。我不理解它(虽然会接受它而只是关闭错误)检查出来:

PS dbRAM:\> cd event_docked

PS dbRAM:\event_docked> dir


SSItemMode                  :   ~<>     
PSPath                      : CodeOwls.PowerShell.SQLite.Provider\SQLite::[Data Source=:memory:]\event_docked\26-02-2017 04:07:54
PSParentPath                : CodeOwls.PowerShell.SQLite.Provider\SQLite::[Data Source=:memory:]\event_docked
PSChildName                 : 26-02-2017 04:07:54
PSDrive                     : dbRAM
PSProvider                  : CodeOwls.PowerShell.SQLite.Provider\SQLite
PSIsContainer               : False
timestamp                   : 26/02/2017 04:07:54
event                       : Docked
StarSystem                  : Laksak
StationEconomy              : $economy_Colony;
StationEconomy_Localised    : Colony
StationFaction              : Lei Cheung
StationGovernment           : $government_Engineer;
StationGovernment_Localised : Workshop
StationName                 : Trader's Rest
RowError                    : 
RowState                    : Unchanged
Table                       : {26-02-2017 04:07:54}
ItemArray                   : {26/02/2017 04:07:54, Docked, Laksak, $economy_Colony;...}
HasErrors                   : False

它的工作,我不知道如何,任何想法发生了什么或我接受它并压制错误?非常感谢你们的帮助。

1 个答案:

答案 0 :(得分:1)

在'this'的情况下,答案是你想使用SQLite powershell模块在SQLite数据库中创建一个新记录,然后通过在新项cmdlet上管理数组来工作。

在'this'的情况下它确实产生了一个错误,但它并不重要,因为数据被正确地插入到SQLite记录中,所以我只是将错误输出重定向到null。