字符串变量未在多行字符串中替换

deo*_*oll 8 string powershell concatenation multiline substitution

这是代码/输出所有在一起:

PS C:\code\misc> cat .\test.ps1; echo ----; .\test.ps1
$user="arun"
$password="1234*"
$jsonStr = @"
{
        "proxy": "http://$user:$password@org.proxy.com:80",
        "https-proxy": "http://$user:$password@org.proxy.com:80"
}
"@
del out.txt
echo $jsonStr >> out.txt
cat out.txt
----
{
        "proxy": "http://1234*@org.proxy.com:80",
        "https-proxy": "http://1234*@org.proxy.com:80"
}
Run Code Online (Sandbox Code Playgroud)

字符串变量的$user内容未被替换$jsonStr.

替换它的正确方法是什么?

Mat*_*att 15

冒号是范围字符:$scope:$variable.PowerShell认为您正在调用$password范围中的变量$user.您可能能够使用子表达式.

$user="arun"
$password="1234*"
@"
{
        "proxy": "http://$($user):$($password)@org.proxy.com:80",
        "https-proxy": "http://$($user):$($password)@org.proxy.com:80"
}
"@
Run Code Online (Sandbox Code Playgroud)

或者您可以使用格式运算符

$user="arun"
$password="1234*"
@"
{{
        "proxy": "http://{0}:{1}@org.proxy.com:80",
        "https-proxy": "http://{0}:{1}@org.proxy.com:80"
}}
"@ -f $user, $password
Run Code Online (Sandbox Code Playgroud)

使用format运算符时,请确保使用大括号.

你也可以用反击来逃避结肠

$jsonStr = @"
{
        "proxy": "http://$user`:$password@org.proxy.com:80",
        "https-proxy": "http://$user`:$password@org.proxy.com:80"
}
"@
Run Code Online (Sandbox Code Playgroud)