PowerShell:使用字符串和哈希表

PowerShell: Working with Strings and Hashtables

我有这个代码:

$passwordsParameters = "sysPassword = 12  &&& testPass = 13 &&& systemPassword = 10"

$parametersList = @($passwordsParameters -split '&&&')

$passwordsTable = @{}


ForEach ($parameter in $parametersList) {
    $splitToKeyValue = @($parameter -split '=')
    $passwordsTable += $passwordsTable = @{
        $splitToKeyValue[0].trim() = $splitToKeyValue[1].trim()
    }
}


ForEach ($pass in $passwordsTable.Keys) {
    if ($passwordsTable[$pass] -ne "") {
        Write-Host "set $pass ="$passwordsTable[$pass]"" 
    } else { 
        Write-Host "A value for the parameter $pass was not entered."
    }
}


# Add-Content "d:\myFile.txt" "set $pass ="$passwordsTable[$pass]""

当我使用 Write-Host 时,它完美地工作。但我想做一些类似于第 25 行评论中的事情。我尝试了几种方法,但我总是得到一个静态字符串,而不是我从哈希表中获得的值。

最后我想要这样的东西:

set pass1 = 12
set pass2 = 5

在myFile.txt

感谢任何帮助。谢谢!

您可以将 Write-Host(仅打印到控制台)更改为 Write-Output(将对象传递到管道)。 Write-Output 不打印到控制台。

$passwordsParameters = "sysPassword = 12  &&& testPass = 13 &&& systemPassword = 10"
$parametersList = @($passwordsParameters -split '&&&')
$passwordsTable = @{}


ForEach ($parameter in $parametersList) {
    $splitToKeyValue = @($parameter -split '=')
    $passwordsTable += $passwordsTable = @{
        $splitToKeyValue[0].trim() = $splitToKeyValue[1].trim()
    }
}

$counter=0
ForEach ($pass in $passwordsTable.Keys) {
    if ($passwordsTable[$pass] -ne "") {
        $counter++
        Write-Output "set "pass$counter = $passwordsTable[$pass]"`n"  | Add-Content -NoNewline myFile.txt 
    } else { 
        Write-Host "A value for the parameter $pass was not entered."
    }
}

输出:

set pass1=10
set pass2=13
set pass3=12

如果您只需将所有 &&& 替换为换行符并使用 cmdlet ConvertFrom-StringData.

,就可以替换第一个 foreach 循环

Add-Content 还有一个名为 -PassThru 的开关,可以让您写入文件并输出到控制台。

$passwordsParameters = "sysPassword = 12  &&& testPass = 13 &&& systemPassword = 10"

$passwordsTable = $passwordsParameters -replace '&&&', [Environment]::NewLine | ConvertFrom-StringData

foreach ($pass in $passwordsTable.Keys) {
    if ($passwordsTable[$pass]) {
        $msg = 'set {0} = {1}' -f $pass, $passwordsTable[$pass]
        # or use: $msg = "set $pass = $($passwordsTable[$pass])" 

        # write this to the file. switch -PassThru will also output to the console
        Add-Content -Path 'D:\myFile.txt' -Value $msg -PassThru
    } else { 
        Write-Host "A value for the parameter '$pass' was not entered."
    }
}