Вот мои 5 центов на эту проблему: я создал следующий скрипт, чтобы рекурсивно распаковать все .7z и все .zip файлы в структуре моей папки. 
Возможно, вам это не понадобится - поэтому вы можете просто удалить эти строки, если хотите:- Поскольку я планирую удалить все файлы .7z и .zip после извлечения, я создал файл cleanup.ps1 (я не удалил архивы сразу по соображениям безопасности).
 - В случае каких-либо ошибок извлечения я поместил команды извлечения в файл ExecUnpack.ps1, чтобы иметь возможность снова извлечь один архив
del "Cleanup.ps1"; 
del "ExecUnpack.ps1"; 
del "ExecUnpack.cmd"; 
get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    """C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.ps1"
    """C:\Program Files\7-Zip\7z.exe"" x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))""" | Out-File -Append "ExecUnpack.cmd"
    $proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))"""); 
    $proc.WaitForExit(); 
    echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)"; 
    "#ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)" | Out-File -Append "Cleanup.ps1"; 
    "del ""$($_.FullName)""" | Out-File -Append "Cleanup.ps1"; 
}
Где это основная часть:
get-childitem . -recurse -include @("*.7z","*.zip") | foreach { 
    $proc=[System.Diagnostics.Process]::Start("C:\Program Files\7-Zip\7z.exe", "x ""$($_.FullName)"" -y -o""$($_.FullName.Replace(" .7z", "\").Replace(".7z", "\").Replace(" .zip", "\").Replace(".zip", "\"))"""); 
    $proc.WaitForExit(); 
    echo "ExitCode=$($proc.ExitCode.ToString()) - $($_.FullName)"; 
}