【问题标题】:How do I write a powershell script that can be invoked to process one file as well as multiple files如何编写可以调用来处理一个文件以及多个文件的powershell脚本
【发布时间】:2018-09-29 07:05:27
【问题描述】:

我创建了一个具有 Foreach-Object 循环的 powershell 脚本,用于格式化位于 InputFolder 中的 xml 文件。 (Format-XML是一个函数)

Get-ChildItem C:\InputFolder -Filter *.xml | 
Foreach-Object {
        cat $_.FullName | Format-XML    
}

现在我们处于项目的不同阶段,我们不希望对所有文件都运行它,而只希望对进来的一个新文件运行它。

如何创建一个 powershell 脚本,该脚本可以将一个文件名作为输入,并且在其他时间以这样一种方式调用,以便在需要时它也可以处理多个文件?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您需要为脚本使用一个参数,以便您可以指定您希望它处理的内容。比如:

    Param(
        $Path
    )
    Get-ChildItem $Path -Filter *.xml | 
    Foreach-Object {
            cat $_.FullName | Format-XML    
    }
    

    然后你可以像这样调用脚本:

    .\FormatXMLFiles.ps1 'C:\InputFolder'
    

    将处理整个文件夹,或者

    .\FormatXMLFiles.ps1 'C:\InputFolder\MyFile.xml'
    

    这只会做一个文件。

    【讨论】:

      【解决方案2】:

      Parameter 属性上为您的函数参数设置ValueFromPipeline 属性。

      例子:

      function foo
      {
          [CmdletBinding()]
          param( [Parameter( Mandatory = $true,
                             Position = 0,
                             ValueFromPipeline = $true )]
                 [string] $File
               )
      
          process
          {
              Write-Host "The file is: $File"
          }
      }
      

      用法:

      PS C:\Users\me> 'a', 'b' | foo
      The file is: a
      The file is: b
      
      PS C:\Users\me> foo -File 'a'
      The file is: a
      

      【讨论】:

      • 这对于函数来说很好,但对于脚本来说则不然。更好的 IMO 是将 ValueFromPipelineByPropertyName=$true 属性添加到参数中,并将 [alias('FullName')] 添加到它,您可以将 Get-ChildItem 传递给函数。
      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多