嵌套目录中的打开zip文件失败,出现“意外令牌”错误

时间:2015-07-01 20:05:53

标签: powershell foreach zip piping

我有一个脚本,我试图通过一个目录排序并打开所有的zip文件并将文本文件存储到一个目录。这是代码:

#Script to open zip files in tree

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) |
               foreach($item in $_.items()){
                   $shell.Namespace($destination).copyhere($item)
               }
    }

我想我几乎拥有它,但不断得到这个错误(任何关于管道的详细说明都会有所帮助):

Unexpected token 'in' in expression or statement.
At E:\Expand-ZIPFile.ps1:14 char:19
+         foreach($item in <<<<  $_.items()){
    + CategoryInfo          : ParserError: (in:String) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken

编辑: 啊......谢谢你的区别。我进行了编辑,但在每次“写主机”检查后看到文件名后,我收到以下错误: `你不能在空值表达式上调用方法。在E:\ Expand-ZIPFile.ps1:14 char:30 + foreach($ item in $ zip.items&lt;&lt;&lt;&lt;()){+ CategoryInfo:InvalidOperation :( items:String)[],RuntimeException + FullyQualifiedErrorId:InvokeMethodOnNull

EDIT2:所以原始代码会将文件复制到新目录,但也会复制整个zip文件。我试图添加一个if语句只复制.txt文件,但代码只是逐步遍历每个目录而不复制任何东西。如果你有任何想法,我会用尽所有的想法,这将是值得赞赏的。这是代码:

 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.Extension -eq ".txt") {
            $shell.Namespace($destination).copyhere($item)
        }
    }

}

1 个答案:

答案 0 :(得分:0)

你让foreach with ForEach-Object loops感到困惑。前者既不读也不写管道。此外,$fileFileInfo对象,而不是路径。 NameSpace方法需要路径字符串,因此您需要使用$file.FullName

替换

$zip = $shell.NameSpace($file) |
       foreach($item in $_.items()){
           $shell.Namespace($destination).copyhere($item)
       }

$zip = $shell.NameSpace($file.FullName)

foreach($item in $zip.items()){
    $shell.Namespace($destination).copyhere($item)
}