2016-08-23 115 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'將執行任意代碼,所以我不會推薦這麼做。 –