#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 различаются (вы можете посмотреть разницу). В данном конкретном случае это не имеет значения.