2

基本的にテキストファイルからテキストを読み込んで解釈し、「キー」と「値」をハッシュテーブルに格納するこのスクリプトを実行しようとしています。ここで、テキストファイルからテキストを読み取っているときに、特定のキーと値を変更したいと思います。

以下は私のファイルのテキストです:

line1 = apple  
line2 = firetruck  
line3 = cricket  
line4 = gorilla  
line5 = elephant  
line6 = banana  
line7 = jumper  
line8 = hat  
line9 = deer  
line10 = igloo  

これが私のコードです:

param
(
    [Parameter(Mandatory=$true,  HelpMessage="Please specify the text filename.")]$fileName
)


$hashTable = @{}
$textFile = Get-Content $filename | ForEach-Object `
{
    $equalindex = $_.IndexOf("=")
    $key = $_.Substring(0,$equalindex)

    if($key -like "line2")
    {
        $key = "line2 has been changed"
    }

    $remainingLen = (($_.Length - 1) -$equalindex)
    $value = $_.Substring($equalindex +1, $remainingLen)

    if($value -like "value2")
    {
        $value = "value2 has been changed"
    }

    $hashtable.Add($key,$value)
} 

$hashtable.Set_Item("line5","line5 value has been changed")
$hashtable.GetEnumerator() | Sort-Object name

コードを実行すると、ハッシュテーブルが出力されますが、「line2」キーまたは「value2」値は変更されません。これは、私が達成しようとしていることを実行するための正しい/最も論理的な方法ですか?

4

2 に答える 2

4

先頭および(または)末尾のスペースを削除する必要があります。これを試して:

$ht=@{}

Get-Content $filename | foreach{

    $key,$value = $_.Split('=') | foreach {$_.Trim()}

    if($key -like "line2")
    {
       $key = "line2 has been changed"
    }

    if($value -like "value2")
    {
        $value = "value2 has been changed"
    }

    $ht.Add($key,$value)
}

$ht.GetEnumerator() | Sort-Object name


Name                           Value                                                                                                                                     
----                           -----                                                                                                                                     
line1                          apple                                                                                                                                     
line10                         igloo                                                                                                                                     
line2 has been changed         firetruck                                                                                                                                 
line3                          cricket                                                                                                                                   
line4                          gorilla                                                                                                                                   
line5                          elephant                                                                                                                                  
line6                          banana                                                                                                                                    
line7                          jumper                                                                                                                                    
line8                          hat                                                                                                                                       
line9                          deer   
于 2012-06-18T20:18:57.100 に答える
1

末尾のスペースがあなたをうんざりさせていると思います。

これを変える:

$key = $_.Substring(0,$equalindex)

これに:

$key = $_.Substring(0,$equalindex).Trim(' ')

または、これも機能しているように見えるため、インデックスがオフになっている可能性があります。

$key = $_.Substring(0,$equalindex - 1)
于 2012-06-18T20:15:32.357 に答える