【问题标题】:Unable to set Comobject Value无法设置 Comobject 值
【发布时间】:2017-05-26 15:37:56
【问题描述】:

我有一段代码可以打开一个 word 模板,然后尝试设置命名 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']

运行此 sn-p 时,表单字段设置不正确。但是,当我运行

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

根据需要设置值。

编辑:这是交互式外壳中的示例

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 值?

【问题讨论】:

  • $options['foo'] 是 'bar',因此静态使用该值的相同命令将是 $fields.item('foo').Result = 'bar'
  • BenH - 这就是我的问题。它们应该是相同的东西,但会产生不同的结果。
  • 您的示例行是:$fields.item('foo').Result = 'foo' 不是 $fields.item('foo').Result = 'bar'
  • 有什么区别? @BenH 他说的是在一种情况下没有分配值而在另一种情况下没有分配值......
  • 试试$fields.item('bizz').Result = [string]$options['bizz']???

标签: powershell ms-word com


【解决方案1】:

根据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

我对为什么会这样感兴趣,但这将是另一个主题的主题。正确的投射解决了我的问题。

【讨论】:

  • 这很奇怪,因为我也做过同样的事情,Get-Member 表明两者都是字符串。
  • 我在它上面开始了 [this]stackoverflow.com/questions/41598901/… 线程,我很想知道为什么我们会看到这种行为,但我认为它更适合它自己的线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2011-06-08
  • 2014-12-25
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多