Честно говоря, я не могу сказать, что в своих самых смелых снах я бы попытался закодировать то, что ты сделал так. Вы буквально сделали гору из моль холма. Вы не могли бы сделать это намного сложнее для себя. Я думаю, увидев эти три примера кода, вы поймете, почему вы должны придерживаться K.I.S.S. принцип.
Ваш код Vbscript отлично работает с пробелами. Вероятно, что-то в коде вашего пакетного файла что-то напортачило. Вы можете значительно упростить свой код с помощью одной команды FOR
и просто создать Vbscript один раз. Я изменил VBscript, чтобы принимать аргументы командной строки.
@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"
call :createVBS "unzip.vbs"
FOR %%G IN (*.zip) DO (
cscript //nologo "%vbs%" "%source%\%%~nG" "%source%\%%~G"
del "%%~G"
)
del "%vbs%" 2>nul
exit /b
:CreateVBS
set "vbs=%~1"
del "%vbs%" 2>nul
>%vbs% echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo Set objArgs = WScript.Arguments
>>%vbs% echo If NOT fso.FolderExists(objArgs(0)) Then
>>%vbs% echo fso.CreateFolder(objArgs(0))
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(objArgs(1)).items
>>%vbs% echo objShell.NameSpace(objArgs(0)).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
Powershell существует уже около 10 лет или около того. С тех пор было несколько способов разархивировать файлы в Powershell. Эта первая версия будет работать, если вы используете версию Powershell до версии 5.
@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"
for %%G in (*.zip) do (
powershell -command "Add-Type -AssemblyName System.IO.Compression.FileSystem;[System.IO.Compression.ZipFile]::ExtractToDirectory('%%~G', '.\%%~nG')"
del "%%~G"
)
В версии 5 Powershell код был значительно упрощен с помощью нового командлета.
@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"
for %%G in (*.zip) do (
powershell Expand-Archive '%%~G' -DestinationPath '.\%%~nG'
del "%%~G"
)
Итак, вы можете видеть, как обращение к Powershell значительно сократило объем кода, который вам нужен в вашем пакетном файле.