解压缩后仅复制某些文件类型

时间:2015-07-01 22:13:18

标签: powershell

我有以下代码来解压缩目录树中的许多文件夹:

new-Item E:\Files -type directory

Get-Childitem -path E:\SNL_Insurance\* -recurse -exclude "*.md5" |

Foreach-object {

    $file = $_
    write-host $file;
    $destination = "E:\Files"
    $shell = new-object -com shell.application
    $zip = $shell.NameSpace($file.Fullname) 

    foreach($item in $zip.items()){

        if ($item.name -eq ".txt") {
            $shell.Namespace($destination).copyhere($item)
        }
    }

}

如果没有if语句,脚本也会复制zip文件,而不仅仅是下面包含的文本文件。我以为我可以检查以确保文件扩展名是.txt(或* .txt我已经尝试过)但$ item.name似乎不包含我认为它做的。如果您有任何想法和/或可以在此解释$ shell变量(特别是$ shell.Namespace,这将非常有用),提前感谢。

编辑:感谢您的回复。在看到这些答案之前,我实际上找到了另一种方法。如果有人有兴趣,我发现这是解决方案:

new-Item E:\Files -type directory

Get-Childitem -path E:\SNL_Insurance\Insurance\* -recurse -exclude "*.md5"|

Foreach-object {

    if ($_.extension -eq ".zip") {
        Get-Childitem -path $_ -recurse| 

            Foreach-object {

                    $file = $_
                    write-host $file;
                    $destination = "E:\Files"
                    $shell = new-object -com shell.application
                    $zip = $shell.NameSpace($file.Fullname) 

                    foreach($item in $zip.items()){

                        $shell.Namespace($destination).copyhere($item)

                    }

            }       


    }
}

2 个答案:

答案 0 :(得分:1)

只复制您可以使用的文本文件:

foreach($item in $zip.items()){
if ($item.Type -eq 'Text Document') {
        $shell.Namespace($destination).copyhere($item)
    }
}

OR

$zip.items() | Where-Object {$_.Type -eq 'Text Document'} | 
    Foreach-Object { $shell.NameSpace($Destination).copyhere($_)}

我怎么知道使用type属性?我用过:

$zip.items()

查看可以使用的所有属性。

答案 1 :(得分:0)

Items()方法枚举FolderItem个对象,它们(与query个对象不同)没有FileInfo属性。您可以与-like运算符进行通配符匹配:

Extension

或(如@Kiran建议的那样)检查对象的类型:

foreach ($item in $zip.Items()) {
    if ($item.Name -like '*.txt') {
        $shell.NameSpace($destination).copyhere($item)
    }
}