Разбрызгивание отсутствующего оператора ‘=’ после ключа в хэш-литерале было неполным?

#powershell

#powershell

Вопрос:

Я пытаюсь выполнить этот скрипт, используя Splatting для удаленного сервера (через PowerShell ISE).

Однако он всегда зависает и завершается сбоем.

Я последовал предложению, как в https://www.ibm.com/support/knowledgecenter/en/SSKMKU/com.ibm.wincollect.doc/t_ug_wincollect_cli_install.html

Сценарий:

 $Args = @{
    'EXE'='\PRDFS01-VMDSLwincollect-7.3.0-24.x64.exe'
    'INSTALLDIR'='C:Program FilesIBMWinCollect'
    'LOG_SOURCE_AUTO_CREATION_ENABLED'='True'
    'LOG_SOURCE_AUTO_CREATION_PARAMETERS'=""
    'Component1.AgentDevice'='DeviceWindowsLog'
    'Component1.Action'='create'
    'Component1.LogSourceName'="$env:COMPUTERNAME"
    'Component1.LogSourceIdentifier'="$env:COMPUTERNAME"
    'Component1.Dest.Name'='IBMQradar'
    'Component1.Dest.Hostname'='192.168.111.111'
    'Component1.Dest.Port'='514'
    'Component1.Dest.Protocol'='TCP'
    'Component1.Log.Security'='true'
    'Component1.Log.System'='true'
    'Component1.Log.Application'='true'
    'Component1.Log.DNS Server'='true'
    'Component1.Log.File Replication Service'='true'
    'Component1.Log.Directory Service'='true'
    'Component1.RemoteMachinePollInterval'='3000'
    'Component1.EventRateTuningProfile'='Default (Endpoint)'
    'Component1.MinLogsToProcessPerPass'='100'
    'Component1.MaxLogsToProcessPerPass'='150'
}
$process = Start-Process -ArgumentList "/s" "/v" "/qn" @Args -Wait -PassThru
$process.ExitCode
  

Ошибка:

 At line:9 char:15
      Component1.Action=create
                ~
Missing '=' operator after key in hash literal.
At line:29 char:18
  $process.ExitCode
                   ~
Missing '=' operator after key in hash literal.
At line:29 char:18
  $process.ExitCode
                   ~
The hash literal was incomplete.
      CategoryInfo          : ParserError: (:) [], ParseException
      FullyQualifiedErrorId : MissingEqualsInHashLiteral
  

Хорошо, после обновления, как указано выше, теперь ошибка отличается:

 Start-Process : A positional parameter cannot be found that accepts argument '/qn'.
At line:25 char:12
  $process = Start-Process -ArgumentList "/s" "/v" "/qn" @Args -Wait -P ...
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
      FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
  

Комментарии:

1. Игнорируя разбрызгивание в течение минуты, PowerShell обрабатывает "/s" "/v" "/qn" как позиционные аргументы Start-Process (вроде как -ArgumentList "/s" -MyPositionalParameter1 "/v" -MyPositionalParameter2 "/qn" ). Если вы хотите, чтобы они обрабатывались как список переключателей командной строки, вам нужно разделять элементы запятой, чтобы они представляли собой массив, т. Е. -ArgumentList "/s", "/v", "/qn" , или -ArgumentList @("/s", "/v", "/qn")

Ответ №1:

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

Это не работает.

 $Args = @{
    EXE='\PRDFS01-VMDSLwincollect-7.3.0-24.x64.exe /s /v"/qn'
    Component1.Action=create
}
  

Это делает (обратите внимание, что create также требуются кавычки)

 $Args = @{
    EXE='\PRDFS01-VMDSLwincollect-7.3.0-24.x64.exe /s /v"/qn'
    'Component1.Action'='create'
}
  

На самом деле ISE даже выдаст вам синтаксические ошибки по этому поводу, поэтому я не совсем уверен, как это осталось незамеченным.

Комментарии:

1. Отличается ли двойная или одинарная кавычка в хэш-таблице?

2. Это вообще не связано с хэш-таблицами. Строки, заключенные в одинарные и двойные кавычки, в PowerShell различаются (вы можете посмотреть разницу). В данном конкретном случае это не имеет значения.