2011/12/25

PowerShellを使う試み -3-

Accessデータベースに記録するには、x86で動作させればよかったのだけど。
そうもいかないときもあるのでしょう
x86だとリダイレクトっていうことっすか。とはいえ、mdbに情報を入れていきたいから、なんとかx64で情報収集してmdbに渡していく。


そこで、Start-Job コマンドレットで、RunAs32 パラメータを使ってmdbへの処理を32ビットプロセスで実行させてみた。本来はバックグラウンドジョブなのだけどちょうど良いので使ってみた。Wait-Job コマンドレットでジョブ終了を待機させちゃう。
$script:scriptPath = Split-Path $MyInvocation.MyCommand.Path
$script:dbName = Join-Path $scriptPath output.mdb
$script:cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$dbName"
$script:strSQL = @'
CREATE TABLE tblFiles(
    ID AUTOINCREMENT CONSTRAINT PK PRIMARY KEY,
    FileName TEXT(255),
    DirectoryName TEXT(255),
    Length Decimal,
    LastWriteTime DATETIME);
'@

Function CreateDB{
    $j = Start-Job -RunAs32 -ScriptBlock{
            $cat=New-Object -ComObject ADOX.Catalog
            $cat.Create($args[0])
            $cn=$cat.ActiveConnection
            $cn.Execute($args[1])
            $cn.Close()
         } -ArgumentList $cnStr,$strSQL
    $j|Wait-Job|Receive-Job
    Remove-Job $j
}

Function InsertFileInfo{
    $j = Start-Job -RunAs32 -ScriptBlock{
            $adoCn = New-Object -ComObject ADODB.Connection
            $adoRs = New-Object -ComObject ADODB.Recordset
            $adoCn.Open($args[0])
            $adoRs.Open("select * from tblFiles",$adocn,3,3)
            foreach($file in $args[1]){
                $adoRs.AddNew()
                $adoRs.Fields.Item('FileName').Value = $file.Name
                $adoRs.Fields.Item('Length').Value = $file.Length
                $adoRs.Fields.Item('DirectoryName').Value = $file.DirectoryName
                $adoRs.Fields.Item('LastWriteTime').Value = $file.LastWriteTime
                $adoRs.Update()
            }
            $adoRs.Close()
            $adoCn.Close()      
        } -ArgumentList $cnStr,$files
    $j|Wait-Job|Receive-Job
    Remove-Job $j
}

Function GetDir{
    $shell = New-Object -ComObject Shell.Application
    $folderPath = $shell.BrowseForFolder(0,'フォルダを選択',1)
    Return $folderPath.Self.Path
}

$targetDir=GetDir
if ($targetDir -eq $null){exit}
if (!(Test-Path $dbName)){CreateDB}
$script:files = Get-ChildItem $targetDir -Recurse -ErrorAction SilentlyContinue|
                Where-Object{!($_.PSIsContainer)}
InsertFileInfo

0 件のコメント: