【问题标题】:Powershell confusion about Variable关于变量的Powershell混淆
【发布时间】:2019-02-21 05:50:26
【问题描述】:

我对变量感到困惑。

我有代码,其中有以下行:

$search = $Name.SelectedItem.Split('-')[$($Name.SelectedItem.Split('-').Count-1)]+'*'

这一行没有做任何其他事情,因为拆分了一个选定的项目(我正在使用下拉框)并将其传输到 $search。

有趣的是,它正是我想要它做的事情。

当我输入 $search 时,结果可以是例如:

里沃利街*

当我在代码中继续并通过几个数组使用 $search 时,由于某种原因,它不起作用,因为它在 foreach 循环中找不到任何东西。我没有错误消息,即使其中一个阵列中存在 Rue de Rivoli*,它也没有找到任何东西。

当我替换上面的代码并直接给变量$search命名时,如下所示

$search = 'Rue de Rivoli*'

我在数组中的搜索有效。

我在这里缺少什么?我做错了什么,但我不知道是什么,有人可以帮助我理解吗?

非常感谢,

迈克

根据要求,这里有更多代码。有很多东西要处理,所以我把它缩短了。

Clear-Host
$search = $CreateNewUserFormDropDownBoxLocation.SelectedItem.Split('-')[$($CreateNewUserFormDropDownBoxLocation.SelectedItem.Split('-').Count-1)]+'*'
#$search = 'Rue de Rivoli*'

$AllLocations = (get-variable -Include USPennsylvaniaAve, USSixthStreet, USRodeoDrive, USOneMicrosoftWay,`
                    USNorthTantauAvenue, USMarketStreet, USMainStreet, USEmilyDrive,`
                    USCalle8, USBroadway, US18thStreetNW, UKOxfordStreet, UKDowningStreet,`
                    UKBondStreet, FRRuedeRivoli, FRChampsElysees, CHBahnhofstrasse,`
                    CA17thAvenue) | ? {$_.value -is [array]}

Foreach ($Array in $AllLocations)
{
    if ($array.value -like $search)
    {break}
}
$result = "`$$($array.name)"
$result

这将成为一个函数,没有其他任何作用,因为从选定的项目中,它把它拆开并在它后面添加*,所以我可以搜索 带有通配符的名称。

我有几个数组,因此我只包含了必要的数组。下一步是遍历数组,一旦找到该项目,它就会停止并将结果提供给结果。 这是我的测试代码,它运行并执行我想要的,除了 Clear-Host 之后的行。该代码已正确解析并添加到 $search 但不起作用。 在该行代码下方,我有我的作弊行,我直接将正确的结果添加到变量中,它工作正常。

【问题讨论】:

  • 需要更多有关数组的信息并向您展示一段代码。请编辑问题并提供所有必要的信息。
  • 你好 Ranadip,谢谢,我可以给数组,没问题但都是大代码的一部分,所以太多了,所以我把它缩短了。
  • 是的,也需要理解您的代码。因此,如果没有最少的可验证代码,就很难隔离问题。
  • 您是否尝试过使用[-1] 获取最后一个变量而不是重新键入它?或者使用$search = ... ; $search[$search.count-1] 将该行分成两部分以使其更具可读性并没有错。 *只是对代码的建议,而不是答案
  • 哦,请原谅我。在编码方面,我完全是新手。这是我的一个小项目,如有任何错误,请见谅,我努力理解并遵循编码规则,但这并不容易,非常尊重你们。

标签: powershell variables


【解决方案1】:

正如评论,这应该可以解决问题。

(我也将其添加为答案,因此 OP 可以接受它。否则这个问题似乎仍然没有解决)

当硬编码搜索字符串$search = 'Rue de Rivoli*' 有效,但使用Split() 获取搜索字符串无效时,通常使用拆分获得的字符串被空白字符包围。如果你把这些留在里面,字符串会出现看起来还不错,但是当用作比较时它就不起作用了。

例如,如果完整的$CreateNewUserFormDropDownBoxLocation.SelectedItem 字符串是:

"François Exemple - Rue de Rivoli"

然后,使用$CreateNewUserFormDropDownBoxLocation.SelectedItem.Split("-")[-1] 将返回:

" Rue de Rivoli"

注意前面的空格。

只需执行Trim(),您就可以摆脱该空间。

因此该行应该是:

$search = ($CreateNewUserFormDropDownBoxLocation.SelectedItem.Split('-')[-1]).Trim() + '*'

【讨论】:

  • 实际上,您可以删除 cmets,因为您已经将其发布为答案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多