2016-08-03 1 views
1

Fondamentalement, j'ai un script, qui essaie de lire le contenu d'un fichier de configuration appelé commands.ini qui redirige vers un fichier texte qui contient une commande à exécuter.comment exécuter un script qui lit un fichier .ini pour exécuter une commande à partir d'un fichier texte

Voici le contenu du fichier de mon script:

Param(
[Parameter(Mandatory=$true)][string]$config 
) 

#Function to read *.ini file and populate an hashtable 
Function Get-IniFile ($file) { 
    $ini = @{} 

    switch -regex -file $file { 
    "^\[(.+)\]$" { 
    $section = $matches[1].Trim() 
     $ini[$section] = @{} 
    } 
    "^\s*([^#].+?)\s*=\s*(.*)" { 
     $name,$value = $matches[1..2] 
     # skip comments that start with semicolon: 
     if (!($name.StartsWith(";"))) { 
     $ini[$section][$name] = $value.Trim() 
     } 
    } 
    } 
    return $ini 
} 

# Getting parameters from *.ini file 
$ini = Get-IniFile($config) 
$commands_file = $ini['COMMANDS']['commands_file'] 

# In case any of the files containing the commands: EXIT. 
if (Test-Path $commands_file) { 
    [string[]]$commands = Get-Content $commands_file 
} else { 
    Write-Output "# ERROR: cannot read commands_file. Please check configuration. Exiting..." 
    Break 
} 

# This is the command I am trying to run among the various other similar command just to read the ini file 
# and execute the command from the text file which is directed to from the ini file 
invoke-expression $commands_file[0] 

J'ai aussi changé un peu et utilisé commande Invoke-commande, mais ne fonctionne pas.

Voici le contenu du fichier commands.ini:

[COMMANDS] 
; this is where the file to the list of commands to execute will be mentioned 
; 
commands_file = C:\test\Test\find\commands.txt 

et le contenu du fichier commands.txt:

« Get-Process | Where-Object {$ _. Nom-like "a *"} '

mais je reçois toujours la même erreur, peu importe les changements que je fais, je suis sûr que quelque chose ne va pas comme on appelle mes tables de hachage ou quelque chose mais je ne peux pas comprendre ce qui cause exactement cette erreur.

erreur affiché dans PowerShell: Error

C : The term 'C' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the 
spelling of the name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:1 
+ C 
+ ~ 
    + CategoryInfo   : ObjectNotFound: (C:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

S'il vous plaît conseiller les gars, merci à l'avance.

Sera également très apprécié si quelqu'un peut m'expliquer la partie "Obtenir des paramètres de fichier * .ini" dans le script dans les détails, j'ai les connaissances de base PowerShell.

Répondre

1

Il est cette partie qui est défectueuse:

invoke-expression $commands_file[0] 

commands_file $ à ce stade contient une chaîne, "C: \ test \ test \ trouver \ commands.txt", donc quand il utilise [0] pour index en ce qu'il choisit le premier caractère (comme les chaînes peuvent être consultées par index). Le premier caractère est C donc il essaie d'exécuter Invoke-Expression contre cela et vous obtenez le message d'erreur.

Il ne suffit pas simplement de supprimer l'index ([0]), il suffit d'ouvrir le fichier texte. Pour l'utiliser tel qu'il est, vous aurez besoin de fonctionner:

Invoke-Expression (Get-Content $commands_file -Raw) 

Vous pourriez simplement changer $ commands_file (dans le ini) à un .ps1, alors vous pouvez l'appeler plutôt que de se soucier de Invoke-Expression et obtenir -Contenu.

L'analyseur de fichier ini est raisonnablement simple. Il lit le fichier ini ligne par ligne et charge le contenu dans une table de hachage imbriquée (paire clé-valeur). Chaque fois qu'il rencontre une valeur entre crochets ([quelque chose]), il crée une hashtable "section". Chaque fois qu'il rencontre une clé et une valeur (this = that), il ajoute une nouvelle entrée dans la section. Vous vous retrouvez avec cette structure:

@{ 
    'COMMANDS' = @{ 
     'commands_file' = 'C:\stuff\working\scratch\commands.txt' 
    } 
} 

fichiers ini ne sont pas les plus belles choses à travailler, ces jours-ci très ancienne. Les formats JSON, CSV et XML ont tendance à être moins perturbés par l'analyse syntaxique basée sur l'expression régulière.

+0

Désolé Chris pour le commentaire très tard, mais que votre commande a travaillé et fait mon travail, alors je suis devenu occupé,; p merci mon pote :) –