2015-07-01 3 views
0

У меня есть сценарий, который я пытаюсь получить, чтобы отсортировать каталог и открыть все zip-файлы и сохранить текстовые файлы в один каталог. Вот код:Открытые 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 

EDIT: Ааа ... спасибо это различие. Я сделал ваши изменения, но после каждого из моих проверок «write-host», чтобы увидеть имя файла, я получаю следующую ошибку: `Вы не можете вызвать метод в нулевом значении. В E: \ Expand-ZIPFile.ps1: 14 char: 30 + foreach ($ item in $ zip.items < < < <()) {+ 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) 
     } 
    } 

} 
+0

Благодарности @AnsgarWiechers вы слишком полезно! Я новичок в этом powerhell jazz – CRa

+0

сделано. http://stackoverflow.com/questions/31172579/only-copy-certain-file-types-after-unzipping – CRa

ответ

0

Вы ошибаетесь foreach with ForEach-Object loops. Первые не читают и не пишут на трубопроводы. Кроме того, $file является объектом FileInfo, а не дорогой. Метод 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) 
}