2016-08-23 81 views
0

我们正在尝试为我们的脚本创建输入文件,而不是使用此处的字符串(@"E-mail text"@)在代码内对电子邮件的文本进行硬编码。然而,似乎很难填充像$MyVariable这样不简单和简单但需要像$MyVariable.User.Name那样解决的变量。展开文件中的变量

无论如何,下面的代码演示了这个问题。

HTML输入文件

Dear $($Object.User.GivenName) 
Thank you for joining the program. 

代码

$SamAccountNameManager = 'Mike' 
$SamAccountNameUser = 'Bob' 
$File = 'C:\Test.html' 

$Object = [PSCustomObject]@{ 
    User = Get-ADUser $SamAccountNameUser -Properties GivenName 
    Manager = Get-ADUser $SamAccountNameManager -Properties GivenName 
} 

$Template = Get-Content $File 
$ExecutionContext.InvokeCommand.ExpandString($Template) 

错误

Exception calling "ExpandString" with "1" argument(s): "Object reference not set to an instance of an obj 
ect." 

怎么可能使用VAR在文本文件中输入$Object.User.GivenName并使其填充正确的值?

+0

我无法从给定的(测试PowerShell中的例子重现错误2和5)。 –

+0

试了一遍,只是为了确定,仍然是同样的错误。在Windows Server 2012上使用PowerShell 4.0。 – DarkLite1

回答

0

$ExecutionContext.InvokeCommand.ExpandString()扩展字符串中的变量。它不评估复杂的表达式。基本上,使事情的工作你想要的方式,你需要创建单个变量

$GivenName = Get-ADUser $SamAccountNameUser -Properties GivenName | 
      Select-Object -Expand GivenName 
$Manager = Get-ADUser $SamAccountNameManager -Properties GivenName | 
      Select-Object -Expand GivenName 

$Template = Get-Content $File | Out-String 
$ExecutionContext.InvokeCommand.ExpandString($Template) 

和使用那些在您的模板:

Dear $GivenName 
Thank you for joining the program.
+0

非常奇怪,因为当我尝试像'Dear $(5 * 5)'这样的计算时,这工作正常。仅适用于带点的变量......如果没有真正的解决方案,那么我认为您的解决方法是唯一的出路。感谢您的帮助。 – DarkLite1

+0

通过使用“@'”'n $模板找到解决方法[这里](http://stackoverflow.com/questions/11605772/why-doesnt-hash-key-syntax-work-inside-the-expandstring-method) 'n'“@”|调用-表达。 – DarkLite1

+1

'Invoke-Expression'将执行任意代码,所以我不会推荐这么做。 –