我正在尝试将给定目录中找到的所有msi文件列出到文件中,然后提取这些msi文件。我试图使用foreach-object中的$ _来传递路径,但它似乎将它解释为文字,而不是传递路径。我认为$ _会传递对象,在这种情况下它将是文件路径,但它似乎没有这样的功能。将找到的文件路径传递给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, $currentDir\Temp"
$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:\temp\test -recurse
$List = $Dir | where {$_.extension -eq ".msi"}
$List | format-table fullname | out-file d:\temp\test\msilist.txt
$List | ForEach-Object {Export-MsiContents -MsiPath $_}
答案 0 :(得分:0)
看起来您正在尝试将childitem对象指定为$MsiPath
,它应该是一个字符串。
因此,您需要指定该对象中的哪个值用作$MsiPath
。在这种情况下,您似乎想要传递fullname
。
试试这个:
$List | ForEach-Object {Export-MsiContents -MsiPath $_.fullname}