2013-07-11 15 views
0

我有一個包含服務器的列表,每行一個,象文本文件:Powershell的:通過在多行txt文件值作爲PARAM語句陣列

SERVER1 
SERVER2 
SERVER3 

當我在文件上一個Get-Content,我也看到輸出爲:

SERVER1 
SERVER2 
SERVER3 

所以,現在我寫,我想在多臺服務器作爲陣列的功能,並反覆在功能陣列上。這個功能目前是這樣的:

function Get-LocalAdministrators 
{ 
    param(
     [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
     [string[]]$computers 
    ) 

    foreach ($computername in $computers) 
    { 
     $ADMINS = get-wmiobject -computername $computername -query "select * from win32_groupuser where GroupComponent=""Win32_Group.Domain='$computername',Name='administrators'""" | % {$_.partcomponent} 

     foreach ($ADMIN in $ADMINS) 
     { 
      $admin = $admin.replace("\\$computername\root\cimv2:Win32_UserAccount.Domain=","") # trims the results for a user 
      $admin = $admin.replace("\\$computername\root\cimv2:Win32_Group.Domain=","") # trims the results for a group 
      $admin = $admin.replace('",Name="',"\") 
      $admin = $admin.REPLACE("""","") # strips the last " 

      $objOutput = New-Object PSObject -Property @{ 
       Machinename = $($computername) 
       Fullname = ($admin) 
       #DomainName =$admin.split("\")[0] 
       #UserName = $admin.split("\")[1] 
      } 

     [email protected]($objOutput) 
     } 

     return $objReport 
    } 
} 

然後我打算調用該函數爲:

Get-Content 「C:\temp\computers.txt」 | Get-LocalAdministrators 

然而,當我運行的功能,我可以看到,$計算機值爲{SERVER3}(即只有文件中的最後一行)。我試圖通過Google找到答案,儘管有很多數組引用/示例,但是我無法找到一個結合讀取文件中的值的地方, param聲明中的數組。請原諒我的PS newb無知,並提供我需要的線索......謝謝。

UPDATE:鏈接截圖腳本PowerGUI腳本編輯器運行顯示運行過程中的$電腦的價值:debug run screenshot

回答

1

當你通過通過管道對象到一個函數,只有一個是在傳遞到你的函數一個時間 - 不是整個陣列。所以你不需要foreach循環,也不需要在函數中創建$computers數組。另外,當你有管道功能時,你應該利用關鍵字begin,processend。每個表示一個腳本塊 - begin是被執行的一個腳本塊一次(當管道被「設置」),process是用於經由管道傳遞的每個對象要執行的腳本塊,和end就像begin只有它在最後一個項目通過後運行。

所以最低限度,你的函數應該是這樣的:

function Get-LocalAdministrators 
{ 
    param(
    [Parameter(Mandatory=$True,Position=0,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
    [string]$computer 
    ) 
process{ 
$ADMINS = get-wmiobject -computername $computername -query "select * from win32_groupuser where GroupComponent=""Win32_Group.Domain='$computername',Name='administrators'""" | % {$_.partcomponent} 
# Do other stuff here 
} 
} 

The MSDN documentation說(這是get-help about_functions - 還有更多比此):

管道對象功能
任何功能可以從管道輸入。您可以使用Begin,Process和End關鍵字來控制 函數如何處理來自管道的輸入。下面的示例語法顯示了這三個關鍵字:

 function <name> { 
      begin {<statement list>} 
      process {<statement list>} 
      end {<statement list>} 
     } 

    The Begin statement list runs one time only, at the beginning of 
    the function. 

    The Process statement list runs one time for each object in the pipeline. 
    While the Process block is running, each pipeline object is assigned to 
    the $_ automatic variable, one pipeline object at a time. 

    After the function receives all the objects in the pipeline, the End 
    statement list runs one time. If no Begin, Process, or End keywords are 
    used, all the statements are treated like an End statement list. 

編輯:看到由OP添加完整的代碼之後,這個工程。請注意,我已經對上述代碼進行了更改。

function Get-LocalAdministrators 
{ 
    param(
     [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)] 
     [string]$computer 
    ) 

    process{ 
     $ADMINS = get-wmiobject -computername $computer -query "select * from win32_groupuser where GroupComponent=""Win32_Group.Domain='$computer',Name='administrators'""" | % {$_.partcomponent} 

     foreach ($ADMIN in $ADMINS) 
     { 
      $admin = $admin.replace("\\$computername\root\cimv2:Win32_UserAccount.Domain=","") # trims the results for a user 
      $admin = $admin.replace("\\$computername\root\cimv2:Win32_Group.Domain=","") # trims the results for a group 
      $admin = $admin.replace('",Name="',"\") 
      $admin = $admin.REPLACE("""","") # strips the last " 

      $objOutput = New-Object PSObject -Property @{ 
       Machinename = $($computer) 
       Fullname = ($admin) 
       #DomainName =$admin.split("\")[0] 
       #UserName = $admin.split("\")[1] 
      } 

     [email protected]($objOutput) 
     } 

     $objReport 
    } 
} 
+0

感謝您的信息,但這仍然不能解決'$ computers'只有一個值(最後一行)來自'Get-Content'的管道的問題......函數確實運行,但只給出了文件中最後一個服務器的輸出...我假設因爲$計算機只有一個值。如何從文件中傳入多個值(行),以便'$ computers'具有多個值? –

+0

** Get-Content **將所有行讀入數組中,其中每個元素都是一行。 ** $ computers **應該具有與文件中行數一樣多的值。我的猜測是你每次都使用輸出文件並覆蓋它,所以最終你只能得到最終迭代的結果。如果你發佈整個功能,這將有所幫助。 –

+0

你沒有顯示你如何做你的輸出。 '$ computers' * does *擁有所有的值(我自己運行這個代碼),如果你用'$ computer'替換'$ admins'行,你會看到所有3個名字的輸出。這導致我得出這樣的結論,即在輸出中有某些東西沒有向我們展示導致您的問題 - 即「(..)」部分。 – alroc