Как обрабатывать циклы для создания файла с помощью powershell? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть INI-файл, и я хочу получить определенный раздел. Пункты в разделе, который я выбрал, - 24 предмета. Я хочу использовать все элементы для записи в файл. Я попробовал это, это работает, но это выглядит как плохой способ написать 24 раза, чтобы сделать процесс. Есть ли другой способ сделать это красивее? Раздел моего INI-файла, подобный этому

Входные данные:

[Code]
A1=12,34,56
A2=23,45,67
A3=34,56,78,9,10
...
A24=a1,b2,c3,d4,e5

Сценарий:

Function F_ML
{
    $FilePath = "C:\Users\File.ini"
    $section = "Code"
    $R_1 = "A1"
    $R_2 = "A2"
    $R_3 = "A3"
    $R_4 = "A4"
    $R_5 = "A5"
    $R_6 = "A6"
    $R_7 = "A7"
    $R_8 = "A8"
    $R_9 = "A9"
    $R_10 = "A10"
    $R_11 = "A11"
    $R_12 = "A12"
    $R_13 = "A13"
    $R_14 = "A14"
    $R_15 = "A15"
    $R_16 = "A16"
    $R_17 = "A17"
    $R_18 = "A18"
    $R_19 = "A19"
    $R_20 = "A20"
    $R_21 = "A21"
    $R_22 = "A22"
    $R_23 = "A23"
    $R_24 = "A24"

    $store = "C:\Users\"

    $FilePath
    $input_file = $FilePath
    $ini_file = @{}

    Get-Content $input_file | ForEach-Object {
    $_.Trim()
    } | Where-Object {


    $_ -notmatch '^(;|$)'
    } | ForEach-Object {
    if ($_ -match '^\[.*\]$') {
        $section = $_ -replace '\[|\]'
        $ini_file[$section] = @{}
    } else {
        $key, $value = $_ -split '\s*=\s*', 2
        $ini_file[$section][$key] = $value
    }
    }

     #--------
     $Path_Store = $store
     #---------
     $Get_1 = $ini_file.($section).($R_1)
     $L_1 = $Get_1.Substring(0,3)

     $Get_2 = $ini_file.($section).($R_2)
     $L_2 = $Get_2.Substring(0,3)

     $Get_3 = $ini_file.($section).($R_3)
     $L_3 = $Get_3.Substring(0,3)


     #---------
     $Outer = ";********************"
     $Header = ";*******************"
     $ML = "12345"
     $FB = ";Initial=1a2b"
     #----------
     $B_ID_1 = ";Build=" + $ML + "#" + "S" + $L_1 + "#" + "D" + $L_1
     $CRM_1 = ";CRM="  + $R_1
     $Output_1 = $Header, $B_ID_1, $FB, $CRM_1 , $Outer | Out-File $Path_Store\A1

     $B_ID_2 = ";Build=" + $ML + "#" + "S" + $L_2 + "#" + "D" + $L_2
     $CRM_2 = ";CRM="  + $R_2
     $Output_2 = $Header, $B_ID_2, $FB, $CRM_2 , $Outer | Out-File $Path_Store\A2

     $B_ID_3 = ";Build=" + $ML + "#" + "S" + $L_3 + "#" + "D" + $L_3
     $CRM_3 = ";CRM="  + $R_3
     $Output_3 = $Header, $B_ID_3, $FB, $CRM_3 , $Outer | Out-File $Path_Store\A3


     #---------
    }

    $call = F_ML

Мое ожидание, я могу сделать этот путь короче, и на выходе получается 24 выходных файла.

Output Sample
Output File 1
;********************
;Build=12345#S12#D12
;Initial=1a2b
;CRM=A1
;********************

Output File 2
;********************
;Build=12345#S23#D23
;Initial=1a2b
;CRM=A2
;********************

Ответы [ 3 ]

0 голосов
/ 17 июня 2019

Используйте ForEach для работы со строкой и Invoke Expression.

1..24 | ForEach-Object { Invoke-Expression -Command (
    '$R_{0} = "A{0}"' -f $_
)}
.
.
.
1..24 | ForEach-Object { Invoke-Expression -Command (
    '$Get_{0} = $ini_file.($section).($R_{0}) `
     $L_{0} = $Get_{0}.Substring(0,3)' -f $_
)}
.
.
.
1..24 | ForEach-Object { Invoke-Expression -Command (
    '$B_ID_{0} = ";Build=" + $ML + "#" + "S" + $L_{0} + "#" + "D" + $L_{0}
     $CRM_{0} = ";CRM="  + $R_{0}
     $Output_{0} = $Header, $B_ID_{0}, $FB, $CRM_{0} , $Outer | Out-File $Path_Store\A{0}' -f $_
)} 

{0} будет заменено значением -f, поэтому будет заменено Foreach число от 1 до 24 ...

0 голосов
/ 17 июня 2019

Будет ли это работать?

Все, что я здесь сделал, - это использовал ваш существующий код для запуска всего цикла с 1 по 24, удаляя дублирующийся код.Я переформатировал это немного, таким образом, мне было немного легче читать.

По существу, переменная $i будет числом от 1 до 24, тогда как переменная $R будет "A", и любое число будет в $i (по сути A + $i)

Function F_ML
{
    $section = "Code"
    $store = "C:\Users\"
    $input_file = "C:\Users\File.ini"
    $ini_file = @{}

    for ($i=1; $i -le 24; $i++) 
    {
        $R = "A$($i)"

        Get-Content $input_file | 

        ForEach-Object `
        {
            $_.Trim()
        } | 

        Where-Object `
        {
            $_ -notmatch '^(;|$)'
        } | 

        ForEach-Object `
        {
            if ($_ -match '^\[.*\]$') 
            {
                $section = $_ -replace '\[|\]'
                $ini_file[$section] = @{}
            } 

            else 
            {
                $key, $value = $_ -split '\s*=\s*', 2
                $ini_file[$section][$key] = $value
            }
        }

         #--------
         $Path_Store = $store
         #---------
         $Get = $ini_file.($section).($R)
         $L = $Get.Substring(0,3)

         #---------
         $Outer = ";********************"
         $Header = ";*******************"
         $ML = "12345"
         $FB = ";Initial=1a2b"
         #----------
         $B_ID = ";Build=" + $ML + "#" + "S" + $L + "#" + "D" + $L
         $CRM = ";CRM="  + $R
         $Output = $Header, $B_ID, $FB, $CRM , $Outer | Out-File $Path_Store\$R
    }
}
0 голосов
/ 17 июня 2019

Попробуйте ниже ...

$IniContent = Get-Content -Path $IninPath
$IniContent | ForEach-Object -Process {
  $Split          = $_ -split '=';
  $OutPutfilePath = "c:\temp\$($Split[0]).txt"
  $first          = ($Split[1] -split ',')[0]
  $append         = "#S{0}D{1}" -f $first,$first

  # create a herestring to build the output
  @"
  ;********************
  ;Build=$Ml$append
  $FB
  ;CRM=$($Split[0])    
  ;********************
  "@ | Out-File -Path $OutPutfilePath -Force
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...