为什么在提示符中输入相同的字符串并将其作为变量传递时会得到不同的输出?

问题描述 投票:1回答:1

有人可以向我解释为什么当我输入由powershell提示输入的相同字符串时我看到不同的输出,而当我输入变量时输入另一个输出。我想知道如何在提示符中输入字符串时格式化字符串,以产生我将其作为变量传递时获得的相同输出。

test.ps1

param (
    [Parameter(Mandatory=$true)]
    [String]
    $NewArgumentString
)

$NewArguments = (Write-Output $NewArgumentString | ConvertFrom-StringData)
$NewArguments

跑:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> .\test.ps1 -NewArgumentString $testString

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1


PS> .\test.ps1

cmdlet a.ps1 at command pipeline position 1
Supply values for the following parameters:
NewArgumentString: HOSTNAME = jburns-test`nIP = 127.0.0.1

Name                           Value
----                           -----
HOSTNAME                       jburns-test`nIP = 127.0.0.1

enter image description here

powershell
1个回答
1
投票

这个代码对提示与传入变量的响应不同的原因是因为我们正在处理解释字符串与文字字符串之间的区别。 a.k.a.单引号与双引号。

提示符处的字符串被视为文字字符串,而不是解释字符串。这就是为什么在提示符下你不能引用变量。为了演示这与示例的不同影响,让我们通过它来运行它,我们在传递的变量中交换单引号的双引号,以模拟在提示符下写入字符串:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> $testString2 = 'HOSTNAME = jburns-test`nIP = 127.0.0.1'

PS> .\test.ps1 -NewArgumentString $testString

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1


PS> .\test.ps1 -NewArgumentString $testString2

Name                           Value
----                           -----
HOSTNAME                       jburns-test`nIP = 127.0.0.1

在这里,我们看到确认文字单引号字符串的解释与提示符相同。真正发生的是两个字符串不一样。对于第一个双引号字符串,在赋值之后,PowerShell将两个字符组合“`n”(0x96 + 0x6E)转换为单个换行“LF”(0x0A)字符。我们可以通过比较字符串长度来看到这一点:

PS> $testString = "HOSTNAME = jburns-test`nIP = 127.0.0.1"
PS> $testString.Length
37

PS> $testString2 = 'HOSTNAME = jburns-test`nIP = 127.0.0.1'
PS> $testString2.Length
38

为了在示例中真实地复制我们理论的结果,让我们通过用不可打印的LF字符替换`n(仅可以使用ALT + numpad方法)来输入存储在变量中的-same-“按位”字符串的提示符。 ALT + 0010

PS> .\test.ps1

cmdlet a.ps1 at command pipeline position 1
Supply values for the following parameters:
NewArgumentString: HOSTNAME = jburns-test
IP = 127.0.0.1

Name                           Value
----                           -----
HOSTNAME                       jburns-test
IP                             127.0.0.1

瞧!我们已经复制了结果。 PowerShell没有坏掉。我们对功能和参数传递的信心得以恢复!


顺便说一下,可能不建议将字符串传递给函数并依赖函数将其转换为哈希表,因为正如您所证明的那样,它可以提供不可预测的结果。我会直接将Hash Table(Type [hashtable])直接传入函数:

就是它.ps3

param (
    [Parameter(Mandatory=$true)]
    [hashtable]
    $MyHashTable
)

Write-Output $MyHashTable
PS> $testHashTable = @{ "HOSTNAME" = "jburns-test" ; "IP" = "127.0.0.1" }
PS> .\test.ps1 -MyHashTable $testHashTable

Name                           Value
----                           -----
IP                             127.0.0.1
HOSTNAME                       jburns-test
© www.soinside.com 2019 - 2024. All rights reserved.