更新
虽然我从下面的评论中学到了一种更快的方法来解决这个问题,但仍然不清楚为什么会发生这种情况。经过实验,我发现问题出在我没有在开头为[string] $return
和(第 10-11 行)赋值。如果赋值(包括)或删除变量,函数将返回一个字符串,它将在主函数中被赋值为字符串。[char] $trailingBackslash
Remove-TrailingBackslashIfPresent
$null
我意识到 PowerShell 不需要声明变量。但是,我出于习惯这样做,这样我就可以跟踪脚本中的变量。
因此,我正在修改这个问题以理解为什么未初始化的变量导致从返回字符串的函数返回时字符串类型未被分配给变量?我将在声明时开始初始化变量,但如果知道并理解为什么会更好。
原始问题
概述
我有一个函数,它按预期返回一个字符串值,但是当它被分配给另一个函数中的另一个字符串变量时,它就变成了一个数组对象。我不知道为什么或如何修复它。
设置
我编写了两个函数。一个是主函数MyScript
,它要求用户输入字符串(即 Windows 路径)。然后,MyScript
将该字符串传递给另一个函数,Remove-TrailingBackslashIfPresent
该函数的作用是检查字符串是否以反斜杠结尾,如果有,则返回不带反斜杠的字符串。但是,由于某种我不知道的原因,从函数返回的字符串Remove-TrailingBackslashIfPresent
在被分配给中的另一个字符串变量后就变成了数组MyScript
。实际上,新分配的变量有前导空格。虽然让代码按预期执行始终很重要,但在我看来,字符串代表 Windows 路径。在中,我在被调用之前和之后都MyScript
包含了它。由于只应该删除尾随的反斜杠,所以应该两次都返回。(Test-Path -Path "$myString")
Remove-TrailingBackslashIfPresent
Remove-TrailingBackslashIfPresent
Test-Path
true
调试信息
我在下面包含了主函数MyScript
和处理反斜杠字符串的函数 Remove-TrailingBackslashIfPresent
。我还在两个关键点包含了调试的屏幕截图。首先,在函数的第 27 行Remove-TrailingBackslashIfPresent
,可以在调试器中看到返回的值 ( $return: "C:\Windows"
) 是一个没有前导空格的字符串。但是,一旦分配给$a
中的变量MyScript
,$a
它就是一个具有三个字段的数组对象 ( $a: [Object[3]]
)。最后,我包含了 PS 终端中的输出。
为什么会出现这种情况?我该怎么做才能解决它(即在类似情况下我应该使用什么语法来避免将来发生这种情况)?谢谢!
01: function Remove-TrailingBackslashIfPresent
02: {
03: # SYNTAX: Remove-TrailingBackslash [-inputString] <string>
04: [CmdletBinding()]
05: param
06: (
07: [Parameter(Mandatory=$true)][string]$inputString
08: )
09:
10: [string] $return
11: [char] $trailingBackslash
12:
13: $inputLen=$inputString.Trim().Length
14:
15: if ($inputLen -le 1)
16: {
17: return $inputString
18: }
19: else
20: {
21: $lastChar=$lastChar=("$inputString".trim().Substring("$inputString".Trim().Length-1,1))
22:
23: if ($lastChar -eq '\') {$return=("$inputString".trim().Substring(0,"$inputString".Trim().Length-1))}
24: else {$return="$inputString"}
25:
26:
27: "$return"
28: }
29: }
30:
31: function MyFunction
32: {
33: [CmdletBinding()]
34: param
35: (
36: [Parameter()][string]$myString
37: )
38:
39: $testA=(Test-Path -Path "$myString")
40: Write-Output "A: $myString ==> $testA"
41:
42: $isroot=$false
43: if (!($isRoot))
44: {
45: [string]$a
46: $a=(Remove-TrailingBackslashIfPresent "$myString")
47: }
48: $testB=(Test-Path -Path "$a")
49: Write-Output "B: $myString ==> $testB"
50:
51: $myString=$a
52: }