Как вызвать функцию из скрипта powershell? - PullRequest
0 голосов
/ 14 марта 2019

Как мне распечатать список файлов , вызвав Get-FilesByDate из самого скрипта files.ps1?

$ 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 Ответ

1 голос
/ 14 марта 2019

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/"

Обратите внимание, как аргументы должны передаваться без скобок вокруг списка аргументов и , разделенных пробелами , а не с помощью псевдо-метода синтаксис вы пытались.
Другими словами: Команды PowerShell (командлеты, функции, сценарии, псевдонимы) вызываются как команды оболочки , а не как методы в C #.


Чтобы передать вывод команды в качестве аргумента другой команде:

  • заключить команду в (...) или
  • , чтобы вывод обрабатывался как массив , заключите его в @(...) или
  • для передачи вывода из нескольких операторов, заключить их в $(...) (или @(...))

Таким образом, чтобы использовать Write-Output явно (что, как указано, не обязательно), вам нужно написать:

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

К заполнить массив выводом из Get-FilesByDate:

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

@(...) гарантирует, что $files получает массив, даже если функция возвращает только единственный файл; в качестве альтернативы, вы можете тип-ограничение переменную и тем самым гарантировать, что это массив:

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

Обратите внимание, однако, что явное использование массивов часто не требуется в PowerShell (начиная с версии 3), потому что даже скаляры (одиночные значения) неявно действуют как массивы - см. этот ответ .


Дополнительная литература:

  • Режимы разбора PowerShell: about_Parsing раздел справки.
  • Как PowerShell анализирует аргументы команды: см. этот ответ .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...