Powershell правильный способ передачи объекта в функцию

Я пытаюсь перечислить все msi-файлы, найденные в данном dir в файл, а затем извлечь эти msi-файлы. Я пытаюсь использовать $_ в foreach-object, чтобы пройти путь, однако он, кажется, интерпретирует его как литерал, вместо того, чтобы проходить путь. Я думал, что $_ передаст объект, который в данном случае будет filepath, но он, похоже, не функционирует таким образом. Как правильно передать найденные пути в функцию Export-MsiContents?

Function Export-MsiContents
{
   [CmdletBinding()]
   param
   (
          [Parameter(Mandatory = $true, Position=0)]
    [ValidateNotNullOrEmpty()]
    [ValidateScript({Test-Path $_})]
    [ValidateScript({$_.EndsWith(".msi")})]
    [String] $MsiPath,

    [Parameter(Mandatory=$false, Position=1)]
    [String] $TargetDirectory
   )

if(-not($TargetDirectory))
{
    $currentDir = [System.IO.Path]::GetDirectoryName($MsiPath)
    Write-Warning "A target directory is not specified. The contents of the MSI will be extracted to the location, $currentDirTemp"
    $TargetDirectory = Join-Path $currentDir "Temp"
}

$MsiPath = Resolve-Path $MsiPath

Write-Verbose "Extracting the contents of $MsiPath to $TargetDirectory"
Start-Process "MSIEXEC" -ArgumentList "/a $MsiPath /qn TARGETDIR=$TargetDirectory" -Wait -NoNewWindow
}

$Dir = get-childitem d:temptest -recurse
$List = $Dir | where {$_.extension -eq ".msi"}
$List | format-table fullname | out-file d:temptestmsilist.txt
$List | ForEach-Object {Export-MsiContents -MsiPath $_}

1 ответ

  1. Похоже, вы пытаетесь указать объект childitem в качестве $MsiPathстроки.
    Поэтому необходимо указать, какое значение в этом объекте будет использоваться в качестве $MsiPath. В этом случае, похоже ,вы хотели бы пройтиfullname.

    Попробовать это:

    $List | ForEach-Object {Export-MsiContents -MsiPath $_.fullname}