无法设置Comobject值

时间:2017-01-11 18:08:02

标签: powershell ms-word com

我有一段代码可以打开一个单词模板,然后尝试设置名为FormFields的值。

$options = @{
    'foo' ='bar';
    'bizz' = 'buzz';
}

$document = 'C:\Form_template.doc'
$word = new-object -ComObject Word.application
$doc = $word.Documents.Open($document)
$word.visible = $true
$fields = $doc.FormFields
$fields.item('foo').Result = $options['foo']
$fields.item('bizz').Result = $options['bizz']

运行此代码段时,表单字段未正确设置。但是,当我跑

$fields.item('foo').Result = 'bar'
$fields.item('bizz').Result = 'buzz'

根据需要设置值。

编辑:以下是Interactive shell中的示例

PS C:\>$fields.item('foo').Result = $options['foo']
PS C:\>$fields.item('bizz').Result = $options['bizz']
PS C:\> $doc.FormFields.Item('foo').Result

PS C:\> $doc.FormFields.Item('bizz').Result

PS C:\>#Now let's try setting the values directly with a string.
PS C:\>$fields.item('foo').Result = 'bar'
PS C:\>$fields.item('bizz').Result = 'buzz'
PS C:\> $doc.FormFields.Item('foo').Result
bar
PS C:\> $doc.FormFields.Item('bizz').Result
buzz

为什么我无法使用哈希值中的值设置FormField值?

1 个答案:

答案 0 :(得分:0)

根据Ben的建议,使用[string]$options['bizz']投射字符串会导致正确设置值。

PS C:\>$fields.item('bizz').Result = [string]$options['bizz']
PS C:\> $doc.FormFields.Item('foo').Result
buzz

经过进一步调查,我发现将哈希值转换为字符串会返回与使用.toString()

不同的类型
PS C:\> $options['bizz'].getType()
IsPublic IsSerial Name                                     BaseType                                                         
-------- -------- ----                                     --------                                                         
True     True     String                                   System.Object                                                    

PS C:\> $options['bizz'].toString().getType()
IsPublic IsSerial Name                                     BaseType                                                         
-------- -------- ----                                     --------                                                         
True     True     String                                   System.Object                                                    

PS C:\> [string]$options['bizz'].getType()
string

我对这是为什么感兴趣,但这将成为另一个主题的主题。正确的演员解决了我的问题。