2017-08-13 8 views
1

SQLiteデータベースにデータを書き込み、そこから読み取るPowershellスクリプトを作成しようとしています。私はこのためにPSSQLiteモジュールを使用しています。このスクリプトはあるサーバーでは動作しますが、他のサーバーでは動作しません。どちらのマシンもWindows 2012 R2です。PowershellとPSSqliteを使用したSQLiteのアクセス - SELECTクエリが失敗する

両方のマシンは、次のようになります。私は、SQLiteのデータベースを作成し、その中にテーブルを作成し、テーブルに書き込み、その後、テーブルから読み取るために短いPowerShellスクリプトを持って

PS C:\> $PSVersionTable 

Name       Value 
----       ----- 
PSVersion      5.0.10586.117 
PSCompatibleVersions   {1.0, 2.0, 3.0, 4.0...} 
BuildVersion     10.0.10586.117 
CLRVersion      4.0.30319.42000 
WSManStackVersion    3.0 
PSRemotingProtocolVersion  2.3 
SerializationVersion   1.1.0.1 


PS C:\> Import-Module PSSQLite 
PS C:\> Get-Module PSSQLite 

ModuleType Version Name        ExportedCommands 
---------- ------- ----        ---------------- 
Script  1.0.3  PSSQLite       {Invoke-SQLiteBulkCopy, Invoke-SqliteQuery, New-SQLiteConn... 

PS C:\> 

。スクリプトは次のようになります。

Import-Module PSSQLite 
$secretsDatabase = ".\secrets.db" 

if (Test-Path $secretsDatabase) { 
    Write-Host "$secretsDatabase already exists" 
} else { 
    $create_query = "create table secrets (tid string, password string, username string)" 
    $cq_result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $create_query 

    $add_secrets_query = "insert into secrets (tid, password, username) values ('xx1', 'somepassword', '[email protected]')" 
    $as_result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $add_secrets_query 
} 

$secretsQuery = "select tid, password, username from secrets limit 1" 

$result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $secretsQuery 
Write-Host $result 

私は1台のサーバー上でこのPowerShellスクリプトを実行すると、出力は次のようになります。

PS C:\> C:\sqlite_test.ps1 
.\secrets.db already exists 
@{tid=xx1; password=somepassword; [email protected]} 

PS C:\> 

これは予想される出力です。

私は他のサーバー上で同じスクリプトを実行すると、出力は次のようになります。テーブルを作成するには、行の作品を挿入するために、両方のシステムで

PS C:\> C:\sqlite_test.ps1 
.\secrets.db already exists 
Unable to find type [DBNullScrubber]. 
At C:\Program Files\WindowsPowerShell\Modules\PSSQLite\1.0.3\Invoke-SqliteQuery.ps1:518 char:25 
+       [DBNullScrubber]::DataRowToPSObject($row) 
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (DBNullScrubber:TypeName) [], RuntimeException 
    + FullyQualifiedErrorId : TypeNotFound 


PS C:\> 

、SQLクエリ。

C:\> sqlite3 secrets.db 
SQLite version 3.19.3 2017-06-08 14:26:16 
Enter ".help" for usage hints. 
sqlite> .dump 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE secrets (tid string, password string, username string); 
INSERT INTO secrets VALUES('xx1','somepassword','[email protected]'); 
COMMIT; 
sqlite> 

つのマシン上のSELECTクエリがあるため、「[DBNullScrubber]」エラーの失敗しかし:これは、両方のマシンでコマンドラインユーティリティを使用して、この結果を得ることによって証明されます。どのマシンでこの問題を解決するには?

------ UPDATE:2017年8月13日より分析-----------------

私はこのためにGitHubのレポで洞窟探検いくつかのコードをしましたモジュール、ファイルへの

Invoke-SqliteQuery.ps1

私が悪いのサーバー上で、私のPowershellに行き、そのファイルからこのコードスニペットを実行しました:

$cSharp = @' 
       using System; 
       using System.Data; 
       using System.Management.Automation; 

       public class DBNullScrubber 
       { 
        public static PSObject DataRowToPSObject(DataRow row) 
        { 
         PSObject psObject = new PSObject(); 

         if (row != null && (row.RowState & DataRowState.Detached) != DataRowState.Detached) 
         { 
          foreach (DataColumn column in row.Table.Columns) 
          { 
           Object value = null; 
           if (!row.IsNull(column)) 
           { 
            value = row[column]; 
           } 

           psObject.Properties.Add(new PSNoteProperty(column.ColumnName, value)); 
          } 
         } 

         return psObject; 
        } 
       } 
'@ 

このスニペットはDBNullScrubberクラスを定義します。その後、私は悪いサーバー上の私のコマンドラインに行って、走っ:

PS C:\> Add-Type -TypeDefinition $cSharp -ReferencedAssemblies 'System.Data','System.Xml' 
Add-Type : (0) : Warning as Error: Invalid search path 'D:\Program Files\IBM\SQLLIB\LIB' specified in 'LIB environment variable' -- 'The system cannot find 
the path specified. ' 
(1) :     using System; 
At line:1 char:2 
+ Add-Type -TypeDefinition $cSharp -ReferencedAssemblies 'System.Data' ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (error CS1668: W...th specified. ':CompilerError) [Add-Type], Exception 
    + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand 

Add-Type : Cannot add type. Compilation errors occurred. 
At line:1 char:2 
+ Add-Type -TypeDefinition $cSharp -ReferencedAssemblies 'System.Data' ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [Add-Type], InvalidOperationException 
    + FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand 


PS C:> 

は、私は良いサーバー上でこれを実行し、エラーがなかったです。

この時点で私は何をすべきか分かりません。これをどうすれば解決できますか?

-----------------アップデート2017年8月13日 - 12時11分----------------

私は$ env:Libを印刷しました。良いマシンには何も定義されていませんでした。悪いマシンでそれは言った:

PS C:\> $env:Lib 
;D:\Program Files\IBM\SQLLIB\LIB 
PS C:\> 
+1

'$ env:LIB'を表示します。 – PetSerAl

答えて

0

Lib環境変数を削除するには、次のコマンドを実行します。

Remove-Item $env:Lib 

さらに、古い値を保存してスクリプトを実行し、古い値を復元します。

Import-Module PSSQLite 
$secretsDatabase = ".\secrets.db" 

$envlib = $env:Lib 
Remove-Item env:Lib 

if (Test-Path $secretsDatabase) { 
    Write-Host "$secretsDatabase already exists" 
} else { 
    $create_query = "create table secrets (tid string, password string, username string)" 
    $cq_result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $create_query 

    $add_secrets_query = "insert into secrets (tid, password, username) values ('xx1', 'somepassword', '[email protected]')" 
    $as_result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $add_secrets_query 
} 

$secretsQuery = "select tid, password, username from secrets limit 1" 

$result = Invoke-SqliteQuery -DataSource $secretsDatabase -Query $secretsQuery 
Write-Host $result 

$env:Lib = $envlib 
関連する問題