3

現在、テキスト ファイルの 1 行の編集に取り組んでいます。テキスト ファイルを上書きしようとすると、テキスト ファイルに 1 行しか返されません。で関数を呼び出そうとしています

modifyconfig "test" "100"

config.txt:

チェック=0
テスト=1

modifyConfig()関数:

Function modifyConfig ([string]$key, [int]$value){
    $path = "D:\RenameScript\config.txt"

    ((Get-Content $path) | ForEach-Object {
        Write-Host $_
        # If '=' is found, check key
        if ($_.Contains("=")){
            # If key matches, replace old value with new value and break out of loop
            $pos = $_.IndexOf("=")
            $checkKey = $_.Substring(0, $pos)
            if ($checkKey -eq $key){
                $oldValue = $_.Substring($pos+1)
                Write-Host 'Key: ' $checkKey
                Write-Host 'Old Value: ' $oldValue
                $_.replace($oldValue,$value)
                Write-Host "Result:" $_
            }
        } else {
            # Do nothing
        }
    }) | Set-Content ($path)
}

私が受け取った結果config.txt

テスト=100

「check=0」がありません。

私は何を逃したのですか?

4

2 に答える 2

4

$_.replace($oldValue,$value)最も内側の条件で、変更された文字列を置き換え$oldValue$valueから出力しますが、一致しない文字列を出力するコードはありません。そのため、変更された文字列のみが に書き戻され$pathます。

ラインを交換する

# Do nothing

$_

また、内部条件elseに a を含むブランチを追加します。$_

$_または、別の変数に割り当てて、次のようにコードを変更することもできます。

Foreach-Object {
    $line = $_
    if ($line -like "*=*") {
        $arr = $line -split "=", 2
        if ($arr[0].Trim() -eq $key) {
            $arr[1] = $value
            $line = $arr -join "="
        }
    }
    $line
}
于 2013-06-14T00:58:12.070 に答える
1

またはワンライナー..(正確にピンポイントの回答ではなく、質問のタイトルに)

(get-content $influxconf | foreach-object {$_ -replace "# auth-enabled = false" , "auth-enabled = true" }) | Set-Content $influxconf

于 2017-07-10T01:37:17.103 に答える