如何从Powershell脚本中调用函数?

时间:2019-03-14 04:12:17

标签: arrays powershell path scripting console

如何通过在Get-FilesByDate脚本本身内调用files.ps1来打印files的列表?

$ pwsh files.ps1 
Get-FilesByDate
txt
1
1
/home/thufir/

$ cat files.ps1 

Function Get-FilesByDate
{
 Param(
  [string[]]$fileTypes,
  [int]$month,
  [int]$year,
  [string[]]$path)
   Get-ChildItem -Path $path -Include $filetypes -Recurse |
   Where-Object {
   $_.lastwritetime.month -eq $month -AND $_.lastwritetime.year -eq $year }
} #end function Get-FilesByDate

Write-Output Get-FilesByDate("txt",1,1,"/home/thufir/")

另外还是要用文件名填充数组?任何文件或所有文件,或txt

1 个答案:

答案 0 :(得分:1)

Write-Output几乎不需要,因为您可以依靠PowerShell的隐式输出行为

# By neither redirecting nor piping nor capturing the output from 
# this call, what it returns is *implicitly* output.
# Note the absence of parentheses and the separation of arguments with whitespace.
Get-FilesByDate "txt" 1 1 "/home/thufir/"

请注意,必须如何在参数列表中将参数传递且不带括号 ,并空白 分隔,而不是尝试使用伪方法语法。
换句话说:像Shell命令一样调用PowerShell命令(cmdlet,函数,脚本,别名),而不是C#中的方法。


为了将命令的输出作为 argument 传递给另一个命令:

  • 将命令括在(...)
  • 为确保将输出视为 array ,请将其包含在@(...)
  • 要传递 multiple 语句的输出,请将其包含在$(...)(或@(...))中

因此,为了显式使用Write-Output(如上所述,这不是必需的),您必须编写:

Write-Output (Get-FilesByDate "txt" 1 1 "/home/thufir/")

使用Get-FilesByDate 的输出填充数组:

$files = @(Get-FilesByDate "txt" 1 1 "/home/thufir/")

@(...)确保$files接收一个数组,即使该函数碰巧只返回一个单个文件;或者,您可以 type-constrain 变量,从而确保它是一个数组:

[array] $files = Get-FilesByDate "txt" 1 1 "/home/thufir/"

但是请注意,在PowerShell(版本3起)中通常不需要明确使用数组,因为偶数标量(单个值)都隐式地像数组一样-参见this answer


进一步阅读: