2017-01-11 2 views
0

У меня есть фрагмент кода, который открывает шаблон слова, а затем пытается установить значения с именем FormFields.Невозможно установить Comobject Value

$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' 

Значения устанавливаются по желанию.

Редактировать: Вот пример в интерактивной оболочке

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 

Почему я не в состоянии установить значение, используя значения поля формы из хэша?

+0

'$ options ['foo']' is ''bar'', поэтому одна и та же команда, статически использующая значение, будет' $ fields.item (' foo '). Результат =' bar'' – BenH

+0

BenH - Таким образом мой вопрос. Они должны быть одинаковыми, но они дают разные результаты. – thisguy123

+0

Ваша примерная строка: '$ fields.item ('foo'). Результат = 'foo'' не' $ fields.item (' foo '). Результат =' bar'' – BenH

ответ

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 

я заинтересован в том, почему именно, но это будет темой для другого нить. Правильное кастинг разрешил мою проблему.

+0

Это странно, так как я сделал то же самое, и «Get-Member» показал, что оба являются строками. – 4c74356b41

+0

Я начал [this] http://stackoverflow.com/questions/41598901/inconsistent-comobject-property-behavior] поток на нем, мне любопытно узнать, почему мы видим это поведение, но я думаю, что он лучше подходит для это собственная нить. – thisguy123

Смежные вопросы