Сбой выполнения PowerShell из-за пробела в имени каталога - PullRequest
0 голосов
/ 02 сентября 2018

Мне передали сценарий PowerShell, который выполняется для установки исполняемого файла, который находится в том же каталоге. Это упаковано в SCCM (System Center Configuration Manager) для развертывания. Однако развертывание завершается неудачно, если во время развертывания пакета временный директор, в который отправляется пакет, имеет место в любом месте пути к файлу.

Например:

  1. C: \ temp \ deploy - Это пройдет , и программное обеспечение установится.
  2. C: \ temp \ deploymen t 1 \ - Это не удастся из-за пробела между развертыванием и 1
  3. 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.

1 Ответ

0 голосов
/ 02 сентября 2018

Чтобы вызвать программу из командного файла с путем, который содержит пробелы, этот путь должен быть заключен в "...":

# PowerShell string that constructs the command line to write to the batch file.
$installLine = "`"$scriptPath\softwarename.exe`" ..."

`" - это то, как вы вставляете литерал " в строку "..." в PowerShell.

Напротив, вызов cd из командного файла с путем, содержащим пробелы, также работает без , включающего "...", но:

  • , что возможно только без двусмысленности, потому что cd требует только один операнд (целевой каталог)
  • из-за несоответствия тому, как аргументы с пробелами должны обрабатываться всеми другими командами, поддержка этого никогда не была хорошей идеей для начала.
...