在 foreach 语句中的字符串中引用对象的属性

Referencing an object's properties inside a string inside a foreach statement

提前致歉!自学(阅读:刚开始,没有编码经验),所以我可能有一些不正确的术语。

我有一个函数可以加载注册表用户配置单元并生成一个带有用户配置文件 SID 的全局变量 $global:userprofiles。这部分工作正常,看起来像这样:

SID                                          
---                                          
S-1-5-21-3411627100-1852253463-1168398051-500
S-1-5-21-3711182449-2936729792-314897268-1001
DEFAULTUSER

完成该功能后,我需要操作注册表项。如果我执行以下操作....

$key = "Registry::HKEY_USERS$($userprofile.SID)\Something\someone"
foreach($userprofile in $global:userprofiles)
{echo $key}

我得到以下输出:

Registry::HKEY_USERS\DEFAULTUSER\Something\someone
Registry::HKEY_USERS\DEFAULTUSER\Something\someone
Registry::HKEY_USERS\DEFAULTUSER\Something\someone

不太好。

如果我像这样将 $key 放入 foreach 中:

foreach($userprofile in $global:userprofiles)
{
  $key = "Registry::HKEY_USERS$($userprofile.SID)\Something\someone"
  echo $key
}

有效:

Registry::HKEY_USERS\S-1-5-21-3411627100-1852253463-1168398051-500\Something\for\someone
Registry::HKEY_USERS\S-1-5-21-3711182449-2936729792-314897268-1001\Something\for\someone
Registry::HKEY_USERS\DEFAULTUSER\Something\for\someone

我花了太长时间才弄清楚这一点,而且我似乎无法理解哪里出了问题。有人可以提供 ELI5 以便我以后不会犯类似的错误吗?

"Registry::HKEY_USERS$($userprofile.SID)\Something\someone"

expandable (double-quoted) string ("...") 的实例,这意味着扩展(插值)立即发生

也就是$userprofile.SID当时的值$($userprofile.SID)subexpression和一个代入返回静态字符串值

您错误地认为您的字符串会像字符串 模板 一样,在每次访问时被(重新)插入,基于然后-当前值。

  • 此功能需要不同的方法:请参阅

将可扩展字符串放在 foreach 循环中:

 foreach($userprofile in $global:userprofiles)  
  {
    $key = "Registry::HKEY_USERS$($userprofile.SID)\Something\someone"  
    echo $key  
  }

解决了您的问题,因为随后会在每次迭代中创建可扩展字符串,其中插值基于then-current 每次迭代中的值。