Я конвертирую гибридный сценарий 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
, но если я включу этот параметр, я должен установить вышеупомянутую случайную строку ???
Я понимаю, что некоторые из них принципиально связаны, поэтому что-то не может быть нулевым, если установлено другое и т.д., и т.д., но все же кажется, что я смогу сделать это лучше.
IF(!$Format){$Format = 'wdOpenFormatAuto'}
, а не только$Format = 'wdOpenFormatAuto'
? Автоматической переменной с именем$Format
нет, и в опубликованном вами коде она не упоминается ранее - так откуда вы ожидаете появления$Format
? - person Mathias R. Jessen   schedule 24.08.2020