Имена файлов .ZIP с пробелами, которые не работают правильно при создании и распаковке пакета - PullRequest
0 голосов
/ 26 октября 2018

Я закончил написание короткого пакетного сценария, который автоматически разархивирует и удалит все заархивированные файлы в папке загрузок.

Я отлично работаю, за исключением случаев, когда представлены zip-файлы с пробелом в имени.

Я не могу точно сказать, где проблема, поэтому я выложу весь сценарий здесь, поскольку он довольно короткий.

@echo off
setlocal
cd C:\Users\%username%\Downloads\
del /q search_result.txt


for /r %%i in (*.zip) do (
echo %%~nxi >> search_result.txt
)
for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)
end
:unzipAgain
set /p zippedFile=< search_result.txt

Call :UnZipFile "C:\Users\%username%\Downloads\%zippedFile:~0,-4%" "C:\Users\%username%\Downloads\%zippedFile%"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
cd /d %~dp0
set vbs="%temp%\_.vbs"
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%

del C:\Users\%username%\Downloads\%zippedFile%
cd C:\Users\%username%\Downloads\
findstr /V %zippedFile% search_result.txt > newfile.txt
xcopy newfile.txt search_result.txt /y >nul
del newfile.txt /f /q >nul

for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)

del search_result.txt 

TIA, Evyn

nbVBScript не мой, и я не знаю, как он работает, я просто использовал его вместе с моим собственным кодом

1 Ответ

0 голосов
/ 26 октября 2018

Честно говоря, я не могу сказать, что в своих самых смелых снах я бы попытался закодировать то, что ты сделал так. Вы буквально сделали гору из моль холма. Вы не могли бы сделать это намного сложнее для себя. Я думаю, увидев эти три примера кода, вы поймете, почему вы должны придерживаться 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 значительно сократило объем кода, который вам нужен в вашем пакетном файле.

...