有人可以向我解释为什么我输入相同的字符串时会看到不同的输出,一个是在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
这段代码对提示变量与传入变量的响应不同的原因是,因为我们正在处理解释字符串与文字字符串之间的差异。aka单引号与双引号。
提示符下的字符串被视为文字字符串,而不是解释字符串。这就是为什么提示时您不能引用变量的原因。为了演示此示例的不同效果,让我们进行遍历,在该示例中,我们将传递的变量中的双引号替换为双引号,以模拟在提示符下写入字符串:
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
为了在示例中真实地复制我们的理论结果,让我们进入提示,将-n-“按位”字符串存储在变量中,方法是将n替换为不可打印的LF字符(只能通过使用ALT +数字键盘来实现)方法)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尚未损坏。我们对函数和参数传递的信念得以恢复!
顺便说一句,不建议将字符串传递到函数中并依靠函数将其转换为哈希表,因为正如您所演示的那样,这样做可能会导致不可预测的结果。相反,我直接将哈希表(类型[hashtable]
)直接传递给函数:
testHashTable.ps1
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句