2017-02-14 3 views
1

Я хочу объединить шаблон, который выглядит следующим образом:Как совместить шаблон с файлом CSV в Powershell

grant $privs 
    on $table 
    to $user; 

С в CSV-файл, который выглядит следующим образом:

privs,table,user 
ALL,Employees,DBA 
READ,Employees,Analyst 
"READ, WRITE", Employees, Application 
ALL,Departments,DBA 
READ,Departments,"Analyst, Application" 

Для получения SQL-скрипт выглядит следующим образом:

grant ALL 
    on Employees 
    to DBA; 

grant READ 
    on Employees 
    to Analyst; 

grant READ, WRITE 
    on Employees 
    to Application; 

grant ALL 
    on Departments 
    to DBA; 

grant READ 
    on Departments 
    to Analyst, Application; 

Шаблон содержит три параметра, которые выглядят как переменные Powershell. В файле CSV достаточно данных , чтобы указать пять копий шаблона. В реальной жизни это было бы больше похоже на 200 экземпляров.

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

Примечание: Я задаю этот вопрос, чтобы предоставить сообществу ответ.

ответ

1

Я написал функцию Expand-Csv, которая делает это. Вот оно:

<# This function is a table driven template tool. 

    It generates output from a template and 
    a driver table. The template file contains plain 
    text and embedded variables. The driver table 
    (in a csv file) has one column for each variable, 
    and one row for each expansion to be generated. 

    12/12/2016 

#> 

function Expand-csv { 
    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$true)] 
     [string] $driver, 
     [Parameter(Mandatory=$true)] 
     [string] $template 
    ) 
    Process 
    { 
     $pattern = (Get-Content $template) -join "`n" 

     Import-Csv $driver | % { 
     foreach ($p in $_.psobject.properties) { 
      Set-variable -name $p.name -value $p.value 
      } 
     $ExecutionContext.InvokeCommand.ExpandString($pattern) 
     } 
    } 
} 

В рассматриваемом случае, вызов будет выглядеть следующим образом:

Expand-Csv grants.csv grants.tmplt > grants.sql 

Вывод, который придет на консоль перенаправляется в файл.

Я пробовал использовать это для генерации сценариев в самой Powershell, , но следует соблюдать осторожность. ExpandString выполняет некоторую обработку , которую выполняет Invoke-Command, поэтому вы можете получить нежелательные последствия. Я использую только для простейшего типа PS-кода, например, серии вызовов для внешнего приложения.

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

  • Нет связанных вопросов^_^