Мне передали сценарий PowerShell, который выполняется для установки исполняемого файла, который находится в том же каталоге. Это упаковано в SCCM (System Center Configuration Manager) для развертывания. Однако развертывание завершается неудачно, если во время развертывания пакета временный директор, в который отправляется пакет, имеет место в любом месте пути к файлу.
Например:
- C: \ temp \ deploy - Это пройдет , и программное обеспечение установится.
- C: \ temp \ deploymen t 1 \ - Это не удастся из-за пробела между развертыванием и 1
- C: \ temporar y d irectory \ deploy \ - Это приведет к ошибке из-за пробела между временным каталогом и каталогом.
Вот часть кода, который, как я подозреваю, выполняет установку:
if ($softwarename -eq "Not Installed") {
Write-Output "Installing softwarename..."
# Build a massive softwarename installation line
$tempFile = [System.IO.Path]::GetTempFileName() + ".cmd"
$installLine = "$scriptPath\softwarename.exe /s /v`"/qn INSTALLDIR=\`"C:\Program Files\directoryname\softwarename\`" AUTHTOKEN=REDACTED FULLCONSOLEADDRESS=$dest`:8413 HOSTNAME=$Env:COMPUTERNAME 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.Log.Security=true&Component1.Filter.Security.Enabled=true&Component1.Filter.Security.Param=5156&Component1.Filter.Security.Type=Blacklist&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.Destination.Name=$dest&Component1.RemoteMachinePollInterval=300&Component1.EventRateTuningProfile=High+Event+Rate+Server&Component1.MinLogsToProcessPerPass=1250&Component1.MaxLogsToProcessPerPass=1875`"`"`""
$installLine | Out-File -Encoding ascii -filepath $tempFile
Write-Output $tempFile
cmd.exe /c $tempFile
} else {
if ($psversiontable.psversion.major -gt 2) {
$props=ConvertFrom-StringData (Get-Content "c:\Program Files\directoryname\softwarename\config\install_config.txt" -Raw)
if ($props.ConfigurationServer -eq $dest) {
Write-Output "Configuration server is correct - no action"
} else {
Stop-Service (Get-Service -ErrorAction SilentlyContinue softwarename)
$props.ConfigurationServer=$dest
$props.StatusServer=$dest
$props.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File -Encoding ascii -filepath "c:\Program Files\directoryname\softwarename\config\install_config.txt"
del "c:\Program Files\directoryname\softwarename\config\ConfigurationServer.PEM"
Start-Service (Get-Service -ErrorAction SilentlyContinue softwarename)
Write-Output "Configuration server reset to $dest"
}
} else {
Write-Output "Powershell version does not support the reset functionality."
}
Я подозреваю, что причиной проблемы являются следующие две строки:
$tempFile = [System.IO.Path]::GetTempFileName() + ".cmd"
$installLine = "$scriptPath\softwarename.exe /s /v`"/qn
Я подозреваю, что, поскольку выполнение потребует точного пути, а "пробел" в пути к каталогу приведет к "пути не найдены" (интересно, что на моем компьютере с Windows 10 команда смены каталога [cd] работает без указания пути к файлу с пробелами в кавычках) - "" - Это заставляет меня поверить, что я совершенно неправ, однако на данный момент мне больше не на что смотреть).
Может ли кто-нибудь помочь с добавлением параметров, чтобы гарантировать, что сгенерированный патч для исполняемого файла .cmd не имеет пробела?
Я попытался исправить это, добавив пакетный файл, который копирует пакет в статический каталог перед выполнением. Тем не менее, это не удается развернуть через SCCM.