Powershell脚本,用于从文件

时间:2016-06-29 18:13:44

标签: powershell

我有一个快速的项目,我正在为我们的一位副总裁工作。

我们在网络文件共享中存储了几千个CAD作业。文件结构使得CAD作业有一个父文件夹。部分文件夹名称包含作业编号。在文件夹中,有1到多个.ini文本文件,其中包含我需要的连接信息。

我正在寻找一个Powershell解决方案来搜索所有文件夹并从文件夹名称中提取作业编号,并从ini文件中提取所有连接值。

例如,对于名为CM8252390-3的文件夹,作业号为8252390-3。这个文件夹里面有3个ini文件。 ini文件里面的内容如下:

[Connection]
Name=IMP_Acme_3.5
[Origin]
X=-15.044784
Y=19.620095
Z=44.621395

所以我的程序需要给我以下结果

Job         Connection
8252390-3   IMP_Acme1_3.5
8252390-3   IMP_Acme2_3.5
8252390-3   IMP_Acme3_3.5
8254260-1   IMP_Acme3_2.4
8254260-1   IMP_Acme3_4.1
...continued for all folders in the network share

寻找有关如何执行此操作的一些Powershell示例。我是Powershell新手,因此经验有限。有一些使用Windows / DOS bat文件等的经验

谢谢。

更新

我做得更远了。这是我到目前为止所拥有的。它将文件夹名称解析为$ job_num。

Get-ChildItem C:\temp\pwrshell | ForEach-Object -Process {  if ($_.PSIsContainer)
                                                              {
                                                                 if ($_.Name.Substring(0,2) -eq 'CM')
                                                                   {
                                                                     $job_num = $_.Name.Substring(4)
                                                                   }
                                                                 elseif ($_.Name.Substring(0,3) -eq 'Pri' -or 'Hyb' -or 'Had' -or 'Dmo')
                                                                   {
                                                                     $job_num = $_.Name.Substring(5)
                                                                   }
                                                                 $_.Name+' '+$job_num
                                                               }
                                                         }

希望有人可以提供帮助,并为我提供ini文件读取的代码。如果他们等我解决,VP可能会找到另一种解决方案。

1 个答案:

答案 0 :(得分:0)

这可能会提供您正在寻找的输出:

# // Declare an array to hold job objects
$aJobs = @()

Get-ChildItem C:\temp\pwrshell | ForEach-Object -Process {
    if ($_.PSIsContainer)
    {
        # // Store subfolder path in a variable
        $sFolderPath = $_.FullName

        if ($_.Name.Substring(0,2) -eq 'CM')
        {
            $job_num = $_.Name.Substring(2) # // Edited, value 4 returns incomplete string
        }
        elseif ($_.Name.Substring(0,3) -eq 'Pri' -or 'Hyb' -or 'Had' -or 'Dmo')
        {
            $job_num = $_.Name.Substring(5)
        }
        $_.Name+' '+$job_num

        # // Loop through all files in folder with .ini extension

        Get-ChildItem $sFolderPath | Where {$_.Extension -like '.ini'} | foreach {

            $sFilepath = $_.FullName

            # // Read file contents
            $aFiledata = Get-Content $sFilepath

            # // Loop through file lines, looking for line starting with Name=
            foreach ($sFileline in $aFiledata)
            {
                if ($sFileline.SubString(0,5) -eq 'Name=')
                {
                    $connection_name = $sFileline.SubString(5)

                    # // Create a custom PowerShell object to hold values
                    $JobObject = New-Object PSCustomObject -Property @{
                        "Job"        = $job_num
                        "Connection" = $connection_name
                    }

                    # // Add job object to array
                    $aJobs += $JobObject
                }
            }
        }
    }
}

# // Display output
$aJobs | Format-Table Job,Connection