使用PowerShell的Get-ChildItem进行递归

时间:2014-06-01 02:04:35

标签: powershell

这看起来应该很简单,而且我确信它是,但我没有以最好的方式解决它。

我想搜索文件夹结构,返回符合以下条件的文件夹。

  1. 包含.msi文件但不包含可执行文件的文件夹。

  2. 包含.exe文件但不包含.msi文件的文件夹。

  3. 包含exe和msi文件的文件夹。

  4. 每个都将通过管道传输到CSV文件中的列。

    我的问题是我无法弄清楚如何有效地返回包含一种文件类型的文件夹名称,但排除另一种文件类型。我在纸上知道使用-include *.msi-exclude *.exe等似乎很简单,但gci -Recurse -Include *.msi -Exclude *.exe之类的命令包含包含msi和exe文件夹的文件夹,其中我只想要包含msi的文件夹被退回。

    我使用以下目录结构作为测试

    msi only

    msi和exe

    仅限exe

    这有意义吗?

    我正在尝试| where directory -notcontains *.exe和各种类似的事情,但没有一个按我想要的方式工作。

1 个答案:

答案 0 :(得分:2)

不幸的是,只使用recurse参数来包含和排除。如果没有递归,您将无法进行排除。

这是另一种选择。

$folders = dir -path ~ -recurse | ? {$_.PsIsContainer}
$folders | ForEach-Object {
     $exe_files = $_ | dir -filter *.exe
     $msi_files = $_ | dir -filter *.msi
     $type = ''
     if ($exe_files -and $msi_files) {$type = 'Both'}
     if ($msi_files -and -not $exe_files) {$type = 'MSI_ONLY'}
     if ($exe_files -and -not $msi_files) {$type = 'EXE_ONLY'}
     if ($type) {
          New-Object -TypeName PsObject -Property @{Path=$_.FullName;Type="$type"}
     }
} | ConvertTo-Csv | Set-Content ~\out.csv