Замена переменных Powershell с помощью Start-Process и ArgumentList - PullRequest
0 голосов
/ 03 мая 2020

У меня есть немного кода PowerShell, который получает полное доменное имя и сохраняет его в переменную ... прекрасно работает:

$FQDN=(Get-WmiObject win32_computersystem).DNSHostName.ToLower()+"."+(Get-WmiObject win32_computersystem).Domain

LogWrite "[+] Полное имя хоста системы было обнаружено как: $ FQDN "

Однако, когда я go вставляю строку переменной FQDN, я не могу заставить ее работать правильно. Я пробовал тики, двойные и одинарные кавычки, но безуспешно:

Start-Process -Wait $OUTPATH64 -ArgumentList '/s /v"/qn INSTALLDIR=\"C:\Program Files\IBM\WinCollect\" LOG_SOURCE_AUTO_CREATION_ENABLED=TRUE LOG_SOURCE_AUTO_CREATION_PARAMETERS=""Component1.AgentDevice=DeviceWindowsLog&Component1.Action=create&Component1.LogSourceName=REPLACEME&Component1.LogSourceIdentifier=REPLACEME&Component1.Dest.Name=test.domain.com&Component1.Dest.Hostname=test.domain.com&Component1.Dest.Port=514&Component1.Dest.Protocol=TCP&Component1.Log.Security=true&Component1.Log.System=true&Component1.Log.Application=true&Component1.Log.DNS+Server=false&Component1.Log.File+Replication+Service=false&Component1.Log.Directory+Service=false&Component1.RemoteMachinePollInterval=3000&Component1.EventRateTuningProfile=Default+(Endpoint)&Component1.MinLogsToProcessPerPass=100&Component1.MaxLogsToProcessPerPass=150"""'

Там, где вы видите строку «REPLACEME», мне нужно заменить ее на переменную $ FQDN. Всякий раз, когда я использую обратные пометки $FQDN или с двойными кавычками «$ FQDN» или даже с одинарными кавычками «$ FQDN», я получаю буквенную строку «$ FQDN», и фрагмент кода фактически не выполняет замену переменной.

Что мне здесь не хватает? Я также даже пробовал двойные кавычки "$FQDN". Я хочу, чтобы строка REPLACEME была заменена на что-то вроде фактического имени хоста + домен, например hostname.domain.com или на то, что установлено в переменной $ FQDN. Кавычки ArgumentList должны оставаться такими же, поскольку я могу заставить свою команду работать правильно, заключив в кавычки ArgumentList так, как он начинается с 'и заканчивается на "" ". Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вот как это должно работать при использовании обратных тиков:

Start-Process -Wait $OUTPATH64 -ArgumentList "/s /v /qn INSTALLDIR=`"C:\Program Files\IBM\WinCollect\`" LOG_SOURCE_AUTO_CREATION_ENABLED=TRUE LOG_SOURCE_AUTO_CREATION_PARAMETERS=`"Component1.AgentDevice=DeviceWindowsLog&Component1.Action=create&Component1.LogSourceName=$FQDN&Component1.LogSourceIdentifier=$FQDN&Component1.Dest.Name=test.domain.com&Component1.Dest.Hostname=test.domain.com&Component1.Dest.Port=514&Component1.Dest.Protocol=TCP&Component1.Log.Security=true&Component1.Log.System=true&Component1.Log.Application=true&Component1.Log.DNS+Server=false&Component1.Log.File+Replication+Service=false&Component1.Log.Directory+Service=false&Component1.RemoteMachinePollInterval=3000&Component1.EventRateTuningProfile=Default+(Endpoint)&Component1.MinLogsToProcessPerPass=100&Component1.MaxLogsToProcessPerPass=150`""
0 голосов
/ 03 мая 2020

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

Чтобы получить последнее, вы должны использовать расширяемую строку, которая * двойная в кавычках ("..."); Например,
"...SourceName=$FQDN&Component1... "

Поскольку ваша строка содержит встроенных " символов, нам проще всего вариант here-string расширяемой строки (@"<newline>...<newline>"@):

Start-Process -Wait $OUTPATH64 -ArgumentList @"
/s /v"/qn INSTALLDIR=\"C:\Program Files\IBM\WinCollect\" LOG_SOURCE_AUTO_CREATION_ENABLED=TRUE LOG_SOURCE_AUTO_CREATION_PARAMETERS=""Component1.AgentDevice=DeviceWindowsLog&Component1.Action=create&Component1.LogSourceName=$FQDN&Component1.LogSourceIdentifier=$FQDN&Component1.Dest.Name=test.domain.com&Component1.Dest.Hostname=test.domain.com&Component1.Dest.Port=514&Component1.Dest.Protocol=TCP&Component1.Log.Security=true&Component1.Log.System=true&Component1.Log.Application=true&Component1.Log.DNS+Server=false&Component1.Log.File+Replication+Service=false&Component1.Log.Directory+Service=false&Component1.RemoteMachinePollInterval=3000&Component1.EventRateTuningProfile=Default+(Endpoint)&Component1.MinLogsToProcessPerPass=100&Component1.MaxLogsToProcessPerPass=150"""
"@

Если вы используете обычную строку в двойных кавычках ("..."), вам придется экранировать встроенные символы " в виде `" (или * 1029) *).

См. Нижнюю часть этого ответа для получения дополнительной информации о строковых литералах PowerShell; официальная справка topi c: about_Quoting_Rules .

...