Настройка параметров по умолчанию с помощью .Open с помощью COM-объекта Microsoft Word в PowerShell

Я конвертирую гибридный сценарий batch / vbs в PowerShell, и преобразование пакетной части было восхитительно простым, но я немного борюсь с преобразованием VBS.

Я могу открыть текстовый документ, но когда я пытаюсь передать дополнительные параметры, я постоянно получаю ошибки. Я хочу определить каждый необязательный параметр, и в идеале, если он не передан в качестве параметра, используйте значение по умолчанию. Я читал о ISMISSING в Интернете и кое-что о System_Call, но я не мог заставить его работать, поэтому я определил свои собственные значения по умолчанию, но они кажутся повсюду.

Иногда было $true, иногда нужно True, а иногда я могу использовать $wdOpenFormatAuto, иногда wdOpenFormatAuto, а иногда требуется перечисление. Я чувствую, что, возможно, просто заставляю это работать и хочу лучше понять, прежде чем я начну больше работать над этим проектом. Это мое открытое заявление для MS Word в его нынешнем виде. Может ли кто-нибудь помочь улучшить это, помогите мне установить If not Defined, use Default почти для всего.

Я нашел этот поток, в котором упоминалось [Type]::Missing}, и он работал для первых нескольких параметров, но когда я добираюсь до $PasswordDocument, он выдает ошибку.

Откройте документ Word и укажите кодировку с помощью PowerShell

 #Start Word
 $ObjWord = New-Object -comobject Word.Application
 $ObjWord.Visible  = $OPENUI
 $ObjWord.Documents.Open($FILEPATH)

#.Open
 $FILENAME = $FILEPATH
 IF (!$ConfirmConversions){$ConfirmConversions = $FALSE}
 $ReadOnly = $TRUE
 IF (!$AddToRecentFiles){$AddToRecentFiles = $FALSE}
 IF (!$PasswordDocument){$PasswordDocument = 'str'}
 IF (!$PasswordTemplate){$PasswordTemplate = 'str'}
 $Revert = $FALSE
 IF (!$WritePasswordDocument){$WritePasswordDocument = 'str'}
 IF (!$WritePasswordTemplate){$WritePasswordTemplate = 'str'}
 IF (!$Format){$Format = 'wdOpenFormatAuto'}
 IF (!$Encoding){$Encoding = 'str'}
 IF ($OPENUI -eq "FALSE"){$Visible = $FALSE}ELSE{$Visible = $TRUE}
 IF (!$OpenConflictDocument){$OpenConflictDocument = $TRUE}
 IF (!$OpenAndRepair){$OpenAndRepair = $TRUE}
 IF (!$DocumentDirection){$DocumentDirection = $wdLeftToRight}
 IF (!$NoEncodingDialog){[string]$NoEncodingDialog = 'TRUE'}
 $ObjDoc=$ObjWord.documents.open($FILENAME,$ConfirmConversions,$ReadOnly,$AddToRecentFiles,$PasswordDocument,$PasswordTemplate,$Revert,$WritePasswordDocument,$WritePasswordTemplate,$Format,$Encoding,$Visible,$OpenConflictDocument,$OpenAndRepair,$DocumentDirection,$NoEncodingDialog)

Обновление: мне удалось установить большинство по умолчанию, но это такая игра, основанная на пробах и ошибках, что мне это не нравится, я хотел бы понять, что происходит, как узнать, может ли значение принимать missing.

Вот где я сейчас, с ошибками, перечисленными по значениям, которые не будут принимать $ missing.

 #.Open
 $missing = [System.Type]::Missing
 $str = ''
 $FILENAME = $FILEPATH
 IF (!$ConfirmConversions){$ConfirmConversions = $missing}
 IF (!$ReadOnly){$ReadOnly = $TRUE}
 IF (!$AddToRecentFiles){$AddToRecentFiles = $missing}
 IF (!$PasswordDocument){$PasswordDocument = $str} #Exception setting "Open": Cannot convert the "TRUE" value of type "string" to type "Object". # Doesn't Accept $Missing
 IF (!$PasswordTemplate){$PasswordTemplate = $str} #Exception setting "Open": Cannot convert the "TRUE" value of type "string" to type "Object". # Doesn't Accept $Missing
 IF (!$Revert){$Revert = $False} #Parameter value was out of acceptable range # Doesn't Accept $Missing
 IF (!$WritePasswordDocument){$WritePasswordDocument =  $str} #Exception setting "Open": Cannot convert the "TRUE" value of type "string" to type "Object". # Doesn't Accept $Missing
 IF (!$WritePasswordTemplate){$WritePasswordTemplate =  $str} #Exception setting "Open": Cannot convert the "TRUE" value of type "string" to type "Object". # Doesn't Accept $Missing
 IF (!$Format){$Format = 'wdOpenFormatAuto'} #Command failed # Doesn't Accept $Missing
 IF (!$Encoding){$Encoding = $missing}
 IF ($OPENUI -eq "FALSE"){$Visible = $FALSE}ELSE{$Visible = $TRUE}
 IF (!$OpenConflictDocument){$OpenConflictDocument = $missing}
 IF (!$OpenAndRepair){$OpenAndRepair = $missing}
 IF (!$DocumentDirection){$DocumentDirection = $missing}
 IF (!$NoEncodingDialog){[string]$NoEncodingDialog = 'TRUE'}  #Object reference not set to an instance of an object. # Doesn't Accept $Missing
 $ObjDoc=$ObjWord.documents.open($FILENAME,$ConfirmConversions,$ReadOnly,$AddToRecentFiles,$PasswordDocument,$PasswordTemplate,$Revert,$WritePasswordDocument,$WritePasswordTemplate,$Format,$Encoding,$Visible,$OpenConflictDocument,$OpenAndRepair,$DocumentDirection,$NoEncodingDialog)

Интересно, что я могу указать PasswordDocument/PasswordTemplate & WritePasswordDocument/WritePasswordTemplate как отсутствующий, если я НЕ УКАЖУ NoEncodingDialog, но если я включу этот параметр, я должен установить вышеупомянутую случайную строку ???

Я понимаю, что некоторые из них принципиально связаны, поэтому что-то не может быть нулевым, если установлено другое и т.д., и т.д., но все же кажется, что я смогу сделать это лучше.


person FreeSoftwareServers    schedule 24.08.2020    source источник
comment
Проверьте оператор условного присваивания Null ?? = from docs.microsoft.com/en-gb/powershell/scripting/whats-new/.   -  person EylM    schedule 24.08.2020
comment
Обычно я могу читать код и понимать его, но это сбивает с толку! Мне нужно будет проверить это, но я должен был добавить значения, которые не могут быть установлены на null   -  person FreeSoftwareServers    schedule 24.08.2020
comment
@FreeSoftwareServers Откуда вообще взялись все эти переменные?   -  person Mathias R. Jessen    schedule 24.08.2020
comment
@ MathiasR.Jessen Я не уверен, что вы имеете в виду, но переменные определены здесь - ›docs.microsoft.com/en-us/office/vba/api/Word.Documents.Open   -  person FreeSoftwareServers    schedule 24.08.2020
comment
Нет, я имел в виду, почему ты делаешь IF(!$Format){$Format = 'wdOpenFormatAuto'}, а не только $Format = 'wdOpenFormatAuto'? Автоматической переменной с именем $Format нет, и в опубликованном вами коде она не упоминается ранее - так откуда вы ожидаете появления $Format?   -  person Mathias R. Jessen    schedule 24.08.2020
comment
@ MathiasR.Jessen Я хочу, чтобы при желании можно было установить любую переменную, таким образом, это позволяет пользователю устанавливать формат, если это необходимо, но по умолчанию он не установлен   -  person FreeSoftwareServers    schedule 24.08.2020
comment
@EylM, что я могу почерпнуть из этого любопытного? Как это вписывается в мою задачу / сценарий?   -  person FreeSoftwareServers    schedule 25.08.2020