Я использую 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
отлично работает и отображает весь файл из сети. Строки, устанавливающие переменные в переменные добавочного атрибута, также работают правильно.
'$ ExistingConfig = get-content -path" $ LocalFilePath "'? – 4c74356b41
Одно из возможных объяснений заключается в том, что локальный файл существует, но есть _empty_, и в этом случае '$ ExistingConfig' будет' $ null', и любая попытка получить к нему доступ по индексу (индексу) завершится неудачей по мере вашего описания. – mklement0
@ 4c74356b41: '$ LocalFilePath' имеет тип' [string] ', поэтому включение его в двойные кавычки не должно иметь значения. – mklement0