Ошибка распаковки файла при запуске VBS-скрипта из пакета в Windows 10

При запуске VBSраспаковать код пакет в Win 10, я получаю ошибку ниже. Что может быть причиной этого, учитывая, что другие работали раньше? Изменение целевых каталогов или их явная установка не влияют на ошибку.

@echo off
setlocal enabledelayedexpansion
cd /d %~dp0
set vbs="%temp%\_.vbs"
call :UnZipFile "E:\Temp\" "%USERPROFILE%\Downloads\archive.zip\"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%

::error
VBScript runtime error: Object required: 'objShell.NameSpace(...)'

РЕДАКТИРОВАТЬ: изменил расположение файла .zip, теперь скрипт работает. Причиной ошибки была пользовательская папка загрузки, перемещенная на другой том по сравнению со значением по умолчанию% USERPROFILE% \ Downloads. Сценарий, похоже, имеет проблемы с правильной работой с символическими ссылками на системные папки.

 Jean-François Fabre26 июл. 2016 г., 23:37
Вы передаете 2 аргумента?
 sambul3526 июл. 2016 г., 23:57
@ Jean-François Fabre Это пакетный файл, означающий, что расширенные аргументы% 1 и% 2 действительно эхо-копируются в файл .vbs как полные пути. Следовательно, формальная передача в сценарии не требуется.
 sambul3526 июл. 2016 г., 21:43
@Matt Williamson Есть идеи, почему этот скрипт не работает здесь, в Win10?
 sambul3527 июл. 2016 г., 00:28
Значения% 1 и% 2 видны в скрипте в строке вызова. Когда они раскрываются и возвращаются в файл, они оба отправляют пути в кавычках, например, «E: \ Temp \».
 sambul3526 июл. 2016 г., 23:54
@cup Если его не существует, он создается сценарием VBS. Это на самом деле создано, следовательно, отвечая на 2-й части.
 sambul3527 июл. 2016 г., 00:54
Я попытался просто поместить "полные пути" внутри () в файл .vbs вместо аргументов, но он все еще показывает ту же ошибку.
 user601777427 июл. 2016 г., 00:24
% 1 и% 2 содержат кавычки.
 cup26 июл. 2016 г., 23:20
Кажется, работает для меня - E: \ temp существует? У вас есть права на запись в E: \?

Ответы на вопрос(2)

Решение Вопроса

Этот пакетный гибрид основан на сценарии VBS, предложенном здесьлапша, Он довольно хорошо справляется с распаковкой файлов, но при этом имеет преимущество, заключающееся в том, что он не требует отдельного VBS-файла по сравнению с исходным пакетом или полностью отказывается от пакетного сценария в пользу VBS. Для разархивированных файлов требуется целевой каталог.

<!-- : Begin batch script
@echo off
set "dir=%temp%\Unzip" & set "file=%userprofile%\Downloads\archive.zip"
cscript //nologo "%~f0?.wsf" "%file%" "%dir%"
exit /b

----- Begin wsf script --->
<job><script language="VBScript">
Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")

Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214
</script></job>

Метод VBS, по-видимому, имеет проблемы с символическими ссылками или поиском пути к текущей папке, если вы переместили папку «Загрузки» пользователя из ее расположения по умолчанию. В этом случае используйте абсолютные пути в аргументах cscript вместо переменных среды.

Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")

Set DestFldr=objShell.NameSpace(Ag(1))
Set SrcFldr=objShell.NameSpace(Ag(0))
Set FldrItems=SrcFldr.Items
DestFldr.CopyHere FldrItems, &H214
Msgbox "Finished"

Этот код распаковывается.

Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\David Candy>"C:\Users\David Candy\Desktop\David\Documents\Assorted\Scripts\UnZip.vbs" "C:\Users\David Candy\Desktop\42 - ProcessExplorer.zip" "C:\Users\David Candy\Desktop\New Folder (3)"

Вот отладочная версия. Запустите его с помощью CScript.

On Error Resume Next

Set objShell = CreateObject("Shell.Application")
Set Ag=Wscript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")

wscript.echo Ag(0) & "   Is Drive " & fso.DriveExists(Ag(0)) & "   Is Folder " & fso.FolderExists(Ag(0)) & "   Is File " & fso.FileExists(Ag(0))
wscript.echo Ag(1) & "   Is Drive " & fso.DriveExists(Ag(1)) & "   Is Folder " & fso.FolderExists(Ag(1)) & "   Is File " & fso.FileExists(Ag(1))

wscript.echo ""

If fso.FileExists(Ag(1)) = False Then
    Wscript.echo "Zip doesn't exist so trying to Create"
    Set ts = fso.OpenTextFile(Ag(0), 8, vbtrue)
    If Err.Number <> 0 Then
        Wscript.echo "Opening Dest " & Err.number & " " & Err.Description & " " & Err.Source
        Err.Clear
    End If

    BlankZip = "PK" & Chr(5) & Chr(6)
    For x = 0 to 17
        BlankZip = BlankZip & Chr(0)
    Next
    ts.Write BlankZip
    If Err.Number <> 0 Then
        Wscript.echo "Writing Dest " & Err.number & " " & Err.Description & " " & Err.Source
        Err.Clear
    End If
End If

Set DestFldr=objShell.NameSpace(Ag(1))
If Err.Number <> 0 Then
    Wscript.echo "Creating Dest " & Err.number & " " & Err.Description & " " & Err.Source
    Err.Clear
End If

Set SrcFldr=objShell.NameSpace(Ag(0))
If Err.Number <> 0 Then
    Wscript.echo "Creating Source " & Err.number & " " & Err.Description & " " & Err.Source
    Err.Clear
End If


wscript.echo DestFldr.Self.Name & " " & DestFldr.Self.Type & " " & DestFldr.Self.IsBrowsable & " " & DestFldr.Self.IsFileSystem
If Err.Number <> 0 Then
    Wscript.echo Err.number & " " & Err.Description & " " & Err.Source
    Err.Clear
End If

wscript.echo SrcFldr.Self.Name & " " & SrcFldr.Self.Type & " " & SrcFldr.Self.IsBrowsable & " " & SrcFldr.Self.IsFileSystem
If Err.Number <> 0 Then
    Wscript.echo Err.number & " " & Err.Description & " " & Err.Source
    Err.Clear
End If


Set FldrItems=SrcFldr.Items
For Each Itm in FldrItems
    wscript.echo Itm.Name & " " & Itm.IsBrowsable & " " & Itm.IsFileSystem
Next


DestFldr.CopyHere FldrItems, &H10001210 
Msgbox "Finished"

Это выход

C:\Users\User>cscript //nologo "C:\Users\User\Desktop\David\Documents\Assorted\Scripts\UnZip - Copy.vbs" C:\symbols c:\file1.zip
C:\symbols   Is Drive False   Is Folder True   Is File False
c:\file1.zip   Is Drive False   Is Folder False   Is File False

Zip doesn't exist so trying to Create
Opening Dest 70 Permission denied Microsoft VBScript runtime error
Writing Dest 424 Object required Microsoft VBScript runtime error
424 Object required Microsoft VBScript runtime error
symbols File folder False True
wkernel32.pdb False True
wntdll.pdb False True

Показываю, что у меня не было разрешения на его создание.

C:\Users\User>cscript //nologo "C:\Users\User\Desktop\David\Documents\Assorted\Scripts\UnZip - Copy.vbs" C:\symbols c:\file2.zip
C:\symbols   Is Drive False   Is Folder True   Is File False
c:\file2.zip   Is Drive False   Is Folder False   Is File False

424 Object required Microsoft VBScript runtime error
symbols File folder False True
wkernel32.pdb False True
wntdll.pdb False True

Показ файла не существует.

Это когда это работает.

C: \ Windows \ system32> cscript // nologo "C: \ Users \ Пользователь \ Рабочий стол \ David \ Documents \ Assorted \ Scripts \ UnZip - Copy.vbs" C: \ символы c: \ file.zip C: \ символы есть Неверный диск - папка True - неверный файл c: \ file.zip Неверный диск - папка - неверный файл - True

file.zip Сжатый (в архиве) Папка True True символы Файловая папка False True wkernel32.pdb False True wntdll.pdb False True

Я изменил параметры, чтобы не повторять. Смотрите список здесь.

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775799%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

 sambul3527 июл. 2016 г., 04:41
Распаковка - это всего лишь одна из нескольких задач, которые мне нужно запустить из одного пакета. этоответ говорит, пакетный файл может распаковать. Я перезагрузил компьютер и все еще получаю ту же ошибкуVBScript runtime error: Object required: 'DestFldr'.
 user601777427 июл. 2016 г., 07:14
И командная строка, которую вы использовали.
 sambul3527 июл. 2016 г., 01:55
Звонок из партииcscript //nologo %vbs% "C:\Users\user\Downloads\archive.zip\" "C:\Temp\" я получил_.vbs(7, 1) Microsoft VBScript runtime error: Object required: 'DestFldr'
 sambul3528 июл. 2016 г., 01:05
Проводник правильно обрабатывает символические ссылки и знает, какие системные папки являются текущими путями. Есть ли способ отредактировать ваш скрипт, чтобы он мог следовать текущему пути к системной папке, например, «Загрузки»?
 sambul3527 июл. 2016 г., 00:46
Не для меня, когда используется как пакетная функция выше.\_.vbs(7, 30) Microsoft VBScript compilation error: Syntax error, И & H214 отсутствует в файле, так как & является разделителем командных команд. Но даже если я добавлю его вручную в файл .vbs, еще одна ошибка:Subscript out of range, Можете ли вы опубликовать рабочую распаковку пакета, так как распаковка - это только одна из нескольких моих больших функций.
 sambul3527 июл. 2016 г., 07:48
Согласитесь ли вы с тем, что документация часто устаревает и не догоняет разработку ОС? С другой стороны, MS обычно пытается поддерживать обратную совместимость.
 user601777428 июл. 2016 г., 01:16
Он просит Explorer скопировать из одной папки, любой папки, в другую папку, любую папку. Поэтому вам нужно предоставить две папки проводника в качестве параметров.
 user601777427 июл. 2016 г., 03:03
Посмотри на мой ответ и сделай так, как говорит.
 sambul3527 июл. 2016 г., 03:45
Я вообще не трогал твой сценарий. И разместите аргументы в порядке, как в приведенном выше примере. Но это дает вышеуказанную ошибку на моем ПК. Вы свободны придерживаться своего предположения, хотя. Я оценил ваш ответ как благодарность, так как он действительно может работать для вас.
 sambul3527 июл. 2016 г., 07:15
Просто напоминание, вы назвали «gobblygook» код, написанный опытным программистом с 5K повторением, и теперь вы говорите, что я не могу скопировать 5 строк кода. Не думаете ли вы, что может быть другое объяснение, например, методы VBS не работают в Win10 так же, как в WinXP или 7? Я думаю, что мы должны двигаться дальше.
 sambul3527 июл. 2016 г., 07:24
Вот командная строка:_.vbs "%USERPROFILE%\Downloads\archive.zip" "%temp%" Я также пытался поменять аргументы.
 user601777427 июл. 2016 г., 03:35
Оно работает. Ты просто не будешь делать то, что я говорю.
 user601777427 июл. 2016 г., 02:28
Имейте в виду, что имена противоположны. SrcFolder - это папка назначения, а DestFolder - это файл zip. Это потому, что я поменял местами Ag (0) и Ag (1), чтобы изменить программу ZIP на программу Unzip.
 user601777427 июл. 2016 г., 03:53
script.vbs "C:\Users\user\Downloads\archive.zip" "%Temp%"
 user601777428 июл. 2016 г., 00:12
Это Окно Shell CopyHere не VBS. Вы работаете не с файлами, а с COM-объектами оболочки. Это то же самое, что открыть его в Проводнике. Каждый язык COM (VB / JS / VBA / VBS / C ++ / и другие) может использовать объекты COM. Там нет правил, которые вы предлагаете.
 user601777427 июл. 2016 г., 07:43
Это документированный API для доступа к папкам Windows, как если бы они были окнами проводника. Если это не работает, то тот, кто дает данные, дает неверные данные. Вот как работает правильное программирование. Следуя документации. Всегда вините себя.
 sambul3527 июл. 2016 г., 02:10
Добавлена ​​пустая строка в файл, удален обратный слеш после .zip в Ag (0). Теперь ошибкаObject required: 'Source folder'.
 sambul3527 июл. 2016 г., 07:38
Я наконец-то понял проблему. Исходный ZIP-файл был сохранен в глобальной папке «Загрузки» (не может принадлежать тому пользователю, к которому он принадлежит), а аргумент указывал на папку% userprofile% \ Downloads. Я скопировал файл, и теперь ваш автономный скрипт работает. Сделаю серийный гибрид на его основе. Еще раз спасибо! :)
 user601777427 июл. 2016 г., 04:22
Temp не на стандартных окнах. C: \ windows \ temp - системный каталог tmp. Пакетный файл не может быть распакован. Так что вам нужно использовать другой язык.
 user601777427 июл. 2016 г., 05:57
Это потому что ты поменял что-то раньше. Вернитесь к моему ученику в ответе.
 sambul3527 июл. 2016 г., 02:34
Я поменял местами аргументы в строке cscript, теперь ошибкаObject required: 'DestFldr' :)
 sambul3527 июл. 2016 г., 03:04
Извините, у меня это не работает.
 sambul3527 июл. 2016 г., 07:05
Ты серьезно? :) Завтра проверю на другом ПК. Вот мой контент .vbs:Set objShell = CreateObject("Shell.Application") Set Ag=Wscript.Arguments set WshShell = WScript.CreateObject("WScript.Shell") Set DestFldr=objShell.NameSpace(Ag(1)) Set SrcFldr=objShell.NameSpace(Ag(0)) Set FldrItems=SrcFldr.Items DestFldr.CopyHere FldrItems, &H214 Msgbox "Finished"
 sambul3527 июл. 2016 г., 04:54
Я просто запустил ваш скрипт VBS в автономном режиме, и он выдал точно такую ​​же ошибку. Это означает, что моя установка VBS может быть повреждена или отличаться. Вы тестировали свой скрипт на 64-битном ПК с Win 10? Если я меняю аргументы при вызове скрипта, он запускается без ошибок, но не распаковывает файл. Вместо этого он создает новую папку archive.zip в папке Downloads и копирует в нее весь% temp% текущий контент. Я знаю, это звучит безумно. Попробую запустить его на другом ПК или из другого каталога. :)
 sambul3527 июл. 2016 г., 13:54
По какой-то причине на моем ПК «любой» код распаковки VBS не работает, если «исходная папка» находится в перемещенной системной папке, например «Загрузки». Требуется наличие файла .zip в папке с таким же именем в% userprofile%, который обычно остается пустым в случае такого перемещения, несмотря на то, что в папке% userprofile% также имеется специальная символическая ссылка на перемещенную папку «Загрузки». Возможно, метод VBS CopyHere не работает с символическими ссылками или чем-то подобным.
 sambul3527 июл. 2016 г., 04:15
Что ж, если вы перейдете по ссылке на код, который я разместил, за него проголосовали 21 раз, и он был принят в качестве ответа. Я использовал точную копию этого. Я запускаю Cmd от имени администратора, и указанная выше папка определенно существует по умолчанию на всех ПК с Windows. К сожалению,% Temp%, который вместо этого указывает на временную папку пользователя сеанса, работает не так хорошо для меня. Позвольте мне попытаться повторно войти или перезагрузить компьютер. Еще раз спасибо за ваш отзыв, я думаю, что отрицательный результат является нормальным результатом любого теста. Не принимай это на свой счет. Обратите внимание, мой вопрос о пакетном файле, а не автономный код VBS,

Ваш ответ на вопрос