2016-12-14 5 views
1

Я использую PowerShell для чтения некоторых атрибутов расширения из AD, затем прочитайте локальный файл с диска C: (если он существует), замените значения в атрибутах расширения и запишите файл обратно в одно и то же место.Get-content не будет читать файл из пути, содержащего переменную окружения и пробелы

Я также читаю общий файл из сети, если локальный файл не существует, и я буду обновлять этот файл и, если необходимо, записать его на локальный путь.

Я могу получить пользователь AD, значения атрибута расширения, общий файл из сети, заменить атрибуты extensionattributes на некоторые переменные и путь к локальному файлу, но в этом я получаю проблему. Локальный файл хранится в профиле пользователя (который очень бесполезно содержит пробелы), поэтому мне нужно использовать переменную окружения в пути.

Вот мой код:

$names=get-adgroupmember sg-deptest-test | foreach-object { 
    # Get the relevant properties for each user in the group 
    $userdetails = Get-ADUser -Id $_.samaccountname -Properties extensionattribute11, extensionattribute12, extensionattribute13, extensionattribute14, extensionattribute15 

    # Assign the 3CX values in the extension attributes to some variables 
    $AccountName = $userdetails.extensionattribute11 
    $CallerID = $userdetails.extensionattribute12 
    $Extension = $userdetails.extensionattribute13 
    $ID   = $userdetails.extensionattribute14 
    $Password = $userdetails.extensionattribute15 

    # Read the generic 3CX Configuration file on the network into the $3CXconfig 
    # array 
    $3CXconfig = Get-Content \\domain\itservices\appdeployment\3cx\3CXVoipPhone.ini 

    # Set the relevant lines in the $3CXconfig array according to the variables 
    # containing the extensionattribute values 
    $3CXconfig[2] = "Name=$AccountName" 
    $3CXconfig[4] = "CallerID=$CallerID" 
    $3CXconfig[5] = "AuthUser=$Extension" 
    $3CXconfig[6] = "AuthID=$ID" 
    $3CXconfig[7] = "AuthPass=$Password" 

    # Sets the path to the local config file 
    $LocalFilePathPart1 = $env:localappdata 
    $LocalFilePathPart2 = "\3CX Voip Phone\3CXVoipPhone.ini" 
    $LocalFilePath  = $LocalFilePathPart1 + $LocalFilePathPart2 

    # Read the existing 3CX configuration file into the $ExistingConfig array 
    $ExistingConfig = Get-Content -Path $LocalFilePath 

    # If the 3CX local config file already exists, then write the user values 
    # into the correct lines in the array and output the file again. This results 
    # in an unchanged 3CX config file. If it doesn't exist, it'll write the 
    # $3CXconfig array to the correct location. Some other values will need set 
    # (e.g. Playback devices) 
    if (Test-Path $LocalFilePath){ 
    $ExistingConfig[2] = $3CXConfig[2] 
    $ExistingConfig[4] = $3CXConfig[4] 
    $ExistingConfig[5] = $3CXConfig[5] 
    $ExistingConfig[6] = $3CXConfig[6] 
    $ExistingConfig[7] = $3CXConfig[7] 
    $ExistingConfig | Out-File -Filepath $LocalFilePath -Encoding Default 
    } else { 
    $3CXconfig | Out-File -Filepath $LocalFilePath -Encoding Default 
    } 
} 

Проблема с линиями между всеми хэшей. Независимо от того, что я пытаюсь, команда Get-Content НЕ будет читать INI-файл в указанном месте. Путь выглядит следующим образом: C:\Users\User Name\Appdata\Local\3CX Voip Phone\3CXVoipPhone.ini. Таким образом, существуют пробелы как в переменной переменной (%localappdata%), так и в части приложения (3CX Voip Phone).

Я использовал много комбинаций фигурных скобок, кавычек, знак сложения (+), Join-Path, и хотя многие из них собрать правильно, ни один из них не заканчивается населенной $ExistingConfig.

Сообщение об ошибке:

не может индексировать в нулевой массив.

Кажется очевидным, что массив равен нулю, поскольку команда Get-Content не заполнила его.

Просто для подтверждения команда Get-Content для переменной $3CXConfig отлично работает и отображает весь файл из сети. Строки, устанавливающие переменные в переменные добавочного атрибута, также работают правильно.

+0

'$ ExistingConfig = get-content -path" $ LocalFilePath "'? – 4c74356b41

+3

Одно из возможных объяснений заключается в том, что локальный файл существует, но есть _empty_, и в этом случае '$ ExistingConfig' будет' $ null', и любая попытка получить к нему доступ по индексу (индексу) завершится неудачей по мере вашего описания. – mklement0

+0

@ 4c74356b41: '$ LocalFilePath' имеет тип' [string] ', поэтому включение его в двойные кавычки не должно иметь значения. – mklement0

ответ

0

ОП подтвердил, что проблема была пусто (0 байт) $LocalFilePath файл.

Другими словами: $LocalFilePathсуществовали, но это произошло не иметь никакого содержания (это был нулевой байт [-sized] файл).

Если вы читаете содержание Нулевого-Byte файл с использованием Get-Content - например,
$ExistingConfig = Get-Content $LocalFilePath - результат $null (непустого массива).

Таким образом, любая попытка индекса (использовать индекс на) полученной переменной - например, $ExistingConfig[2] - вызывает PowerShell, чтобы сообщить об ошибке Cannot index into a null array..

Смежные вопросы