«Invoke-Expression» отбрасывает двойную кавычку - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть структура каталогов с ZIP-файлами, и я хотел бы извлечь их с помощью скрипта.

Мой сценарий до сих пор:

$7zexe = "c:\bin\7za.exe"
$arg = ""
Get-ChildItem -Recurse -Include *.zip |
ForEach-Object { $argout = $_.Directory.Name
  $arg = " e `"$_`" -o`"$argout`""
  $cmdline = $7zexe, $arg -join ""
  $cmdline
  Invoke-Expression -command  "$cmdline "
}

Но я получаю следующую ошибку

c:\bin\7za.exe e "E:\tmp\the folder\the sub folder\my_big_file.zip" -o"the sub folder"
Invoke-Expression : The string starting:
At line:1 char:86
 + c:\bin\7za.exe e "E:\tmp\the folder\the sub folder\my_big_file.zip" -o"the sub folder <<<< "
 is missing the terminator: ".
At x:\mydocs\testscript.ps1:9 char:18
+ Invoke-Expression <<<<  -command  "$cmdline "
    + CategoryInfo          : ParserError: ( :String) [Invoke-Expression], IncompleteParseException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString,Microsoft.PowerShell.Commands.InvokeExpressionCommand

Почему-то похоже, что PowerShell сбрасывает мое закрытие ".

Я пробовал это с оператором &, и я также пытался заменить аргументы массивом:

[Array]$arg = "e ", "`"$_`""," -o`"$argout`""

1 Ответ

3 голосов
/ 15 ноября 2011

Попробуйте поставить -o внутри кавычек:

$7zexe = "c:\bin\7za.exe"
$arg = ""
Get-ChildItem -recurse -Include *.zip | 
ForEach-Object { $argout = $_.Directory.FullName
  write-host -ForegroundColor Green $argout
  $arg = " e `"$_`" `"-o$argout`""
  $cmdline = $7zexe, $arg -join ""
  $cmdline
  Invoke-Expression -command  "$cmdline "
}

Sidenote: Чтобы убедиться, что содержимое глубоко вложенного zip-файла разархивировано в правильный каталог, я считаю, что вы должны использовать свойство fullname содержащего каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...