从Powershell读取文本文件时为什么不维护订单?

时间:2018-01-26 17:35:07

标签: powershell

以下是我的Powershell脚本:

$server_file = 'serverlist.txt'
$servers = @{}
Get-Content $server_file | foreach-object -process {$current = $_.split(":"); $servers.add($current[0].trim(), $current[1].trim())}
foreach($server in $servers.keys){
    write-host "Deploying $service on $server..." -foregroundcolor green
}

我的serverlist.txt看起来像这样:

DRAKE : x64
SDT: x64
IMPERIUS : x64
Vwebservice2012 : x64

每次运行此脚本时,我都会得到IMPERIUS作为我的服务器名称。我想按照它们在serverlist.txt中编写的顺序遍历服务器。 我在Get-Content电话中遗漏了什么吗?

1 个答案:

答案 0 :(得分:3)

不要将服务器存储在临时变量中。

.NET框架无法保证hashtables@{})的迭代顺序。如果您想维护输入顺序,请避免使用它们。

简单地说:

$server_file = 'serverlist.txt'

Get-Content $server_file | ForEach-Object {
    $current = $_.split(":")
    $server = $current[0].trim()
    $architecture = $current[1].trim()

    Write-Host "Deploying $service on $server..." -ForegroundColor Green
}

注意:即使它在这种特殊情况下可能不会产生很大的不同,通常在使用Get-Content时应始终明确定义文件编码以避免出现乱码数据。 Get-Content没有针对文件编码的复杂自动检测,并且它使用的默认值对于您的输入文件始终是错误的。