5

問題は、選択したユーザーがログインしているコンピューターを検索するために使用されるSQLクエリにあります。クエリを実行し、アダプタを使用して結果をテーブルに入力してから、テーブルオブジェクトを配列に読み込みます。Powershellの配列の構文と機能を完全に理解していないため、この部分を間違って実行している可能性があります。テーブルが配列に読み込まれる関数内では、配列の内容は問題ないように見えますが(コンピューター名だけ)、その配列を関数から渡して変数に割り当てると、配列には次のデータが含まれます。{ #、compName}。見つかったコンピューターの数、次に名前のように見えます。1台のコンピューターが見つかった場合、配列は{1、ComputerName}です。ただし、2台以上の複数のコンピューターが見つかった場合、配列は{2、ComputerNameComputerName}になります。

これは、SQLクエリを使用する関数と、ユーザーがコンピューターを選択する関数です。

Function GetComputerList {
    param ($u)
    #use the display name of the user to get their login name
    $queryUser = Get-ADUser -f{DisplayName -eq $u} #-Properties sAMAccountname | Select sAMAccountname
    $queryName = "'"
    $queryName += $queryUser.SamAccountName
    $queryName += "'"
    $query = "SELECT SYS.Netbios_Name0 FROM v_R_System SYS WHERE User_Name0 = $queryName ORDER BY SYS.User_Name0, SYS.Netbios_Name0"

    $connection = new-object system.data.sqlclient.sqlconnection( "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=SSPI;")
 
    $adapter = new-object system.data.sqlclient.sqldataadapter ($query, $connection)

    $table = new-object system.data.datatable
    
    $adapter.Fill($table)

    $i = 1
    foreach($object in $table) {
        <#Write-Host "$i. $($object.Netbios_Name0)"
        $i++#>
        $compArray += $object.Netbios_Name0
    }
    foreach($object in $compArray) {
        Write-Host "$i. $($object)"
    }
    
    return @($compArray)
}


Function SelectComputer {
    param ($a)
    $computerNum = Read-Host "Please select a computer. (by number)"
    $computer = ($a[$computerNum])
    return $computer
}

そしてそれらはこのように呼ばれます:

$computerArray = GetComputerList -u $selectedUser
$selectedComputer = SelectComputer -a $computerArray

私は完全に迷子になっています、どんな入力でもありがたいです。

4

2 に答える 2

12

GetComputerList関数を単純化すると、私のテストで目的の結果が得られます。

Function GetComputerList {
    param ($u)
    #use the display name of the user to get their login name
    $queryUser = Get-ADUser -f{DisplayName -eq $u} #-Properties sAMAccountname | Select sAMAccountname
   
    $query = @"
        SELECT SYS.Netbios_Name0 
        FROM v_R_System SYS 
        WHERE User_Name0 = '$($queryUser.SamAccountName)'
        ORDER BY SYS.User_Name0, SYS.Netbios_Name0
    "@
    $connection = new-object system.data.sqlclient.sqlconnection( "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=SSPI;") 
    $adapter = new-object system.data.sqlclient.sqldataadapter ($query, $connection)
    $table = new-object system.data.datatable
    $adapter.Fill($table) | out-null
    $compArray = @($table | select -ExpandProperty Netbios_Name0)

    return @($compArray)
}
于 2012-06-14T01:27:45.113 に答える
4

$compArrayまず、それが実際には配列であることを指定する必要があります。宣言することはないため、PowerShellはそれを文字列のように扱い、コンピューター名を相互に追加します。配列であるとGetComputerList宣言する場所:$compArray

$compArray = @()

次に、配列の最初の数値は、実際にはパイプラインに追加される.NET関数からの戻り値です。最も可能性の高い原因は$adapter.Fill($table)です。その戻り値を変数に割り当てます。

$numRows = $adapter.Fill($table)
于 2012-06-14T04:59:54.987 に答える