2010-12-09 4 views
5

나는 Microsoft.SqlServer.Management.Smo.Server 개체의 목록을 interating 등 같은 해시 테이블에 추가하고 :Hashtable 값을 powershell에 추가하는 방법?

$instances = Get-Content -Path .\Instances.txt 
$scripts = @{} 

foreach ($i in $instances) 
{ 
    $instance = New-Object Microsoft.SqlServer.Management.Smo.Server $i 
    foreach($login in $instance.Logins) 
    { 
     $scripts.Add($instance.Name, $login.Script())  
    } 
} 

를 지금까지 너무 좋아. 지금하고 싶은 것은 문자열을 해시 테이블 값의 끝에 추가하는 것입니다. 따라서 $ 인스턴스의 경우 해당 $ 인스턴스의 해시 테이블 값에 문자열을 추가하고 싶습니다. 내가 어떻게 그럴 수 있니? 나는이 시작했지만, 나는 바른 길에있어 있는지 확실하지 않습니다 :

foreach ($db in $instance.Databases) 
{  
    foreach ($luser in $db.Users) 
    { 
     if(!$luser.IsSystemObject) 
     { 
      $scripts.Set_Item ($instance, <what do I add in here?>) 
     } 
    } 
} 

건배

+0

그런데 HashTable 일 필요는 없습니다. 아마도'System.Collections.Generic.Dictionary [string, string]'이 더 좋을까요? –

+0

마크 : PowerShell의 제네릭은 약간 까다 롭습니다. 내가 필사적으로 필요로하지 않는다면, 코드를 실제로 사용하는 것이 분명하지 않기 때문에 대부분 사용한다고 말하고 싶습니다. – Joey

답변

11
$h= @{} 

$h.add("Test", "Item") 
$h; "" 
$h."Test" += " is changed" 
$h 

Name       Value                                     
----       -----                                     
Test       Item                                      

Test       Item is changed                                   
+0

'$ h.Test'가 실제로 충분합니다. 키 이름에 이상한 문자가 없으면 따옴표는 필요하지 않습니다. – Joey

+0

예. 동의했다. 따옴표를 표시하여 다른 사람들이 그 옵션을 알 수 있도록했습니다. –

0

.Script() 방법은 문자열 컬렉션을 반환합니다. 그 일을하지만, 작업을해야

$val = $scripts[$instance] 
$val.Add("text to add") 
$scripts.Set_Item($instance, $val) 

$scripts.Set_Item ($instance, <what do I add in here?>) 

을 대체하는 더 우아한 방법은 아마이있다.

1

나는이 코드와 함께 갈 것이다.

$instances = Get-Content -Path .\Instances.txt 
$scripts = @{} 

foreach ($i in $instances) 
{ 
    $instance = New-Object Microsoft.SqlServer.Management.Smo.Server $i 
    foreach($login in $instance.Logins) 
    { 
     $scripts[$instance.Name] = @($scripts[$instance.Name]) + $login.Script().ToString() 
    } 
} 

.

foreach ($db in $instance.Databases) 
{ 
    foreach ($luser in $db.Users) 
    { 
     if(!$luser.IsSystemObject) 
     { 
      $scripts[$instance] = @($scripts[$instance]) + $luser.Script().ToString() 
     } 
    } 
} 

결과는 키로서 각각의 인스턴스 해시 테이블, 각각의 문자열은 사용자에 대한 T-SQL 스크립트 문자열 배열 될 것이다.

관련 문제