2016-12-14 1 views
1

J'utilise PowerShell pour lire des attributs d'extension à partir d'AD, puis lire un fichier local à partir du lecteur C: (s'il existe), remplacez les valeurs dans les attributs d'extension et réécrivez le fichier au même endroit.Get-content ne lit pas un fichier à partir d'un chemin contenant une variable d'environnement et des espaces

Je lis également un fichier générique du réseau au cas où le fichier local n'existe pas, et je mettrai à jour ce fichier et l'écrirai au chemin local si nécessaire.

Je peux obtenir l'utilisateur AD, les valeurs extensionattribute, le fichier générique du réseau, remplacer l'extensionattributes dans certaines variables, et le chemin du fichier local, mais c'est là que je reçois le problème. Le fichier local est stocké dans le profil de l'utilisateur (qui, très peu, contient des espaces), j'ai donc besoin d'utiliser une variable d'environnement dans le chemin.

Voici mon code:

$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 
    } 
} 

Le problème est avec les lignes entre tous les hash. Peu importe ce que j'essaie, la commande Get-Content ne lira pas le fichier INI à l'emplacement spécifié. Le chemin est comme ceci: C:\Users\User Name\Appdata\Local\3CX Voip Phone\3CXVoipPhone.ini. Il existe donc des espaces dans la partie variable d'environnement (%localappdata%) et la partie spécifique à l'application (3CX Voip Phone).

Je l'ai utilisé plusieurs combinaisons de accolades, des citations, le signe d'addition (+), Join-Path, et bien que beaucoup d'entre eux sont compilées correctement, aucun d'entre eux se termine avec une $ExistingConfig peuplée.

Le message d'erreur est:

ne peut pas indexer dans un tableau nul.

Il semble évident que le tableau est nulle parce que la commande Get-Content ne le remplissiez.

Pour confirmer, la commande Get-Content de la variable $3CXConfig fonctionne parfaitement et affiche l'intégralité du fichier à partir du réseau. Les lignes définissant les variables sur les variables d'extension d'attribut fonctionnent également correctement.

+0

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

+3

Une explication possible est que le fichier local existe, mais est _empty_, auquel cas '$ ExistingConfig' serait' $ null' et toute tentative d'accès par index (indice) échouerait comme vous le décrivez. – mklement0

+0

@ 4c74356b41: '$ LocalFilePath' est de type' [chaîne] ', l'encadrant entre guillemets ne devrait donc pas faire de différence. – mklement0

Répondre

0

L'OP a confirmé que le problème était un vide (zéro octet) $LocalFilePath fichier.

En d'autres termes: $LocalFilePathexistait, mais il est arrivé d'avoir pas de contenu (il était un fichier [-sized] zéro octet).

Si vous lisez le contenu d'un fichier zéro octet en utilisant Get-Content - par exemple,
$ExistingConfig = Get-Content $LocalFilePath - le résultat est $null (pas a un tableau vide ).

Par conséquent, toute tentative de index (utiliser un indice sur) la variable résultante - par exemple, $ExistingConfig[2] - provoque PowerShell pour signaler l'erreur Cannot index into a null array..