首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用powershell处理循环来创建文件?

如何使用powershell处理循环来创建文件?
EN

Stack Overflow用户
提问于 2019-06-17 09:35:02
回答 3查看 78关注 0票数 0

我有INI文件,我想得到特定的部分。我选择的部分有24个项目。我想使用所有的项目写入到一个文件中。我试过了,它起作用了,但它看起来是一个糟糕的方式来写24次来做这个过程。有没有其他更漂亮的方法呢?我的INI文件的部分如下所示

输入ini:

代码语言:javascript
复制
[Code]
A1=12,34,56
A2=23,45,67
A3=34,56,78,9,10
...
A24=a1,b2,c3,d4,e5

脚本:

代码语言:javascript
复制
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个输出文件。

代码语言:javascript
复制
Output Sample
Output File 1
;********************
;Build=12345#S12#D12
;Initial=1a2b
;CRM=A1
;********************

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

回答 3

Stack Overflow用户

发布于 2019-06-17 11:45:25

试试下面的.

代码语言:javascript
复制
$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
 }
票数 0
EN

Stack Overflow用户

发布于 2019-06-17 15:11:26

使用ForEach操作字符串并对Expression执行Invoke操作。

代码语言:javascript
复制
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后面的值,因此它将被替换为从1到24的Foreach数字...

票数 0
EN

Stack Overflow用户

发布于 2019-06-18 00:55:14

这样行得通吗?

我在这里所做的就是使用您现有的代码在从1到24的循环中运行所有内容,删除重复的代码。我稍微重新格式化了一下,这样我就更容易阅读了。

本质上,变量$i将是一个从124的数字,而变量$R将是"A“以及$i中的任何数字(本质上是A + $i)

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56623809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档