0

まず、私はスタックが初めてです。過去に何度もスタックを参照してきましたが、最近、この問題でかなり長い間立ち往生しています。だからここに行きます。

私の目標: 各 VM マシンのカスタム値に一致する VMware からの配列出力を関連付けようとしています。(資産 ID ) を Microsoft SQL 2000 サーバー上の値 ( ID キー ) に変換します。

そのため、このサーバーは 2005 年より前なので、invoke-sqlcmd powershell コマンドを使用できません。このデータベースから値を返すには、完全な SQL 接続文字列とコマンド構造を利用する必要があります。この sql ステートメントとスクリプトは、単独で正常に動作します。つまり、このスクリプトの sql 部分は、単独で機能し、変数「$etag」の代わりに手動のタグ番号を付けて、データベースから結果を引き出します。私はpowershellにかなり慣れていませんが、powershellからSQLを使用しています。

したがって、ここに、保護された名前が取り出された私のスクリプトがあります。

#========================================================================
# Created on:   12/4/2013 2:01 PM
# Created by:   Shaun Belcher
# Filename:     
#========================================================================


function get-inventory
{

Add-PSSnapin VMware.VimAutomation.Core
$date=get-date
$vcenterserver = @("srv-1","srv-2","srv-3")

Connect-VIServer -server $vcenterserver
$toAddr="user@domain.com"
$fromAddr="user@domain.com"
$smtpsrv="mail.domain.com"
#Variables
$mdesks=@()
$sqlServer = "serverdb"
$sqlDBNAME = "instance"
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$DataSet = New-Object System.Data.DataSet
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.connection = $sqlConnection
$sqlAdapter.SelectCommand = $sqlCmd


#db Connection

$sqlConnection.ConnectionString = "Server = $sqlServer; Database = $sqlDBname;   Integrated Security=True;"
$SqlCmd.connection = $SqlConnection
$SqlCmd.commandtext = $sqlQuery
$sqlAdapter.SelectCommand = $sqlCmd
$sqlQuery += "SELECT INVHARDW_PropTag as proptag, invhardw_clientID as ClientID,     invhardw_notes as Notes FROM INV_Hardware where invhardw_proptag = '$etag';"
$SqlCmd.commandtext = $sqlQuery
$sqlAdapter.SelectCommand = $sqlCmd

$sqlAdapter.Fill($DataSet)
$DataSet.Tables[0]
$sqlConnection.Close()





$mdesks = @($DataSet.Tables[0] | select propTag, ClientID, Notes)

$virtuals= @(Get-VM | select Name,vmhost,memoryMB,@{N="Datastore";E={[string]::Join(',',(Get-Datastore -Id $_.DatastoreIdList | Select -ExpandProperty Name))}})
$etags = @(Get-vm | Get-Annotation |select value,@{N="mDeskNote";E={[string]::Join(',',($mdesk | Where-Object {$mdesks.propTag = $_;}))}},@{N="mDeskClientID";E={[string]::Join(',',($mdesk | Where-Object {$mdesks.propTag = $_;}))}})





if($virtuals -ne $null){
$body = @("
    <center><table border=1 width=50 % cellspacing=0 cellpadding=8 bgcolor=Black cols=3>
    <tr bgcolor=White><td>Virtual Machine</td><td>Host Machine</td><td>Memory Allocated</td><td>DatastoreList</td><td>Asset Tag</td><td>App Note</td><td>App Client ID</td></tr>")


$i = 0
do {

        #if($i % 2){$body += "<tr bgcolor=#D2CFCF><td>$($virtuals[$i].Name)</td></tr>";$i++}
        #else {$body += "<tr bgcolor=#EFEFEF><td>$($virtuals[$i].Name)</td></tr>";$i++}
        if($i % 2){$body += "<tr bgcolor=#D2CFCF><td>$($virtuals[$i].Name)</td><td>$($virtuals[$i].VMHost)</td><td>$($virtuals[$i].MemorymB)</td><td>$($virtuals[$i].datastore)</td><td>$($etags[$i].value)</td><td>$mdesks[$i].notes</td><td>$mdesks[$i].ClientID</td></tr>";$i++}
        else {$body += "<tr bgcolor=#EFEFEF><td>$($virtuals[$i].Name)</td><td>$($virtuals[$i].VMHost)</td><td>$($virtuals[$i].memorymb)</td><td>$($virtuals[$i].datastore)</td><td>$($etags[$i].value)</td><td>$mdesks[$i].notes</td><td>$mdesks[$i].ClientID</td></tr>";$i++}
}

while ($virtuals[$i] -ne $null)

$body += "</table></center>"
# Send email.
if($attachmentPref){
    $virtuals | Export-CSV "Inventory $($date.month)-$($date.day)-$($date.year).csv"
    Send-MailMessage -To "$toAddr" -From "$fromAddr" -Subject "$vcenterserver Inventory = $countvms" -Body "$body" -Attachments "Inventory $($date.month)-$($date.day)-$($date.year).csv" -SmtpServer "$smtpsrv" -BodyAsHtml
    Remove-Item "Inventory $($date.month)-$($date.day)-$($date.year).csv"
}
Else{
    Send-MailMessage -To "$toAddr" -From "$fromAddr" -Subject "Inventory $vcenterserver = $countvms" -Body "$body" -SmtpServer "$smtpsrv" -BodyAsHtml
}
}

Disconnect-VIServer -Server $vcenterserver -Confirm:$false exit



get-inventory

これにより、情報が返され、情報の列と行が記載された電子メールで送信されます。繰り返しますが、これら 2 つのスクリプトは、求める結果を返さないだけです。

4

0 に答える 0