使用Select-Object从导入的服务器列表中设置变量

时间:2016-04-19 16:46:39

标签: powershell foreach select-object

目前我有下面的脚本可以工作但是我有超过30台服务器并且它们经常更改所以我很好奇是否有更简单的方法来使用我的每台服务器的导入数据更新$ServerList变量。服务器路径是相同的,我可以维护一个包含所有服务器名称的Server.txt文件。有关如何简化此操作以使用更大的服务器列表的任何想法,我可以在需要时更新,而无需在powershell脚本中添加行?

$Headers = "Extension","Server IP","Comment"
$1 = Import-Csv "\\Server1\app\test\Stations.txt" -Header $Headers | Select-Object *, @{n='Server Name';e={'Server1'}}
$2 = Import-Csv "\\Server2\app\test\Stations.txt" -Header $Headers | Select-Object *, @{n='Server Name';e={'Server2'}}
$3 = Import-Csv "\\Server3\app\test\Stations.txt" -Header $Headers | Select-Object *, @{n='Server Name';e={'Server3'}}
$4 = Import-Csv "\\Server4\app\test\Stations.txt" -Header $Headers | Select-Object *, @{n='Server Name';e={'Server4'}}

$ServerList = $1,$2,$3,$4

2 个答案:

答案 0 :(得分:1)

是的,您可以使用Get-Content cmdlet获取服务器列表(您必须先创建Server.txt)。然后,您可以使用Foreach-Object cmdlet(别名%)迭代它并使用当前服务器:

$Headers = "Extension","Server IP","Comment"
$servers = Get-Content 'Your_path_to_server.txt'
$ServerList = $servers | 
    % { $server = $_; Import-Csv ("\\{0}\app\test\Stations.txt" -f $server) -Header $Headers | 
    Select-Object *, @{n='Server Name';e={$server}} } 

现在,如果添加服务器,则无需更改脚本上的任何内容。 这是相同的脚本,但可能会更好地了解你:

$Headers = "Extension","Server IP","Comment"
$serverNames = Get-Content 'Your_path_to_server.txt'

$ServerList = @()

foreach ($serverName in $serverNames)
{
    $ServerList += Import-Csv "\\$serverName\app\test\Stations.txt" -Header "Extension","Server IP","Comment" |
     Select-Object *, @{n='Server Name';e={$serverName}}
}

答案 1 :(得分:0)

我会用于这样的方法是为它创建一个函数。这是一些未经测试的示例代码。

Function Import-ServerListCSV($serverName){
   $Headers = "Extension","Server IP","Comment"
   Import-Csv "\\$serverName\app\test\Stations.txt" -Header $Headers | Select-Object *, @{n='Server Name';e={$serverName}}
}

$ServerList = "Server1","Server2","Server3","Server4" | % {Import-ServerListCSV $_}