<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: работа с CAB архивами]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=2924&amp;type=atom" />
	<updated>2009-05-13T11:15:49Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=2924</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: работа с CAB архивами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=22909#p22909" />
			<content type="html"><![CDATA[<p>Работает под Windows XP/2003. Создание архива работает и под Windows 2000.<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objCAB
Dim objFSO
Dim objFile
Dim objShell

Dim objFolderItem

Set objCAB   = WScript.CreateObject(&quot;MakeCab.MakeCab&quot;) &#039; Под Windows 2000 указывать напрямую только зависимый от версии CLSID — &quot;MakeCab.MakeCab.1&quot;
Set objFSO   = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objShell = WScript.CreateObject(&quot;Shell.Application&quot;)


&#039;
&#039; Создание cab-файла
&#039;
objCAB.CreateCab &quot;C:\Test.cab&quot;, False, False, False &#039; Под Windows 2000 — только три параметра

&#039; Добавляем в cab-файл все файлы из папки C:\Temp под теми же именами
For Each objFile In objFSO.GetFolder(&quot;C:\Temp&quot;).Files
    objCAB.AddFile objFile.Path, objFile.Name
Next

objCab.CloseCab


&#039;
&#039; Просмотр содержимого cab-файла
&#039;
For Each objFolderItem In objShell.Namespace(&quot;C:\Test.cab&quot;).Items
    WScript.Echo objFolderItem.Name
Next


&#039;
&#039; Извлечение содержимого cab-файла в папку
&#039;
If Not objFSO.FolderExists(&quot;c:\Test&quot;) Then
    objFSO.CreateFolder &quot;c:\Test&quot;
End If

objShell.Namespace(&quot;c:\Test&quot;).CopyHere objShell.Namespace(&quot;C:\Test.cab&quot;).Items


Set objShell = Nothing
Set objFSO   = Nothing
Set objCAB   = Nothing

WScript.Quit 0</code></pre></div><p>P.S. Некоторые несознательные программы портят и не восстанавливают за собой правильные ассоциации для .cab файлов, вследствие чего скрипт может работать некорректно. Вот файл реестра, который вернёт настройки ассоциации для типа файлов .cab по умолчанию (для Windows XP):</p><p><strong><em>RestoreCabAssocDefaults.reg</em></strong><br /></p><div class="codebox"><pre><code>REGEDIT4

[HKEY_CLASSES_ROOT\.cab]
@=&quot;CLSID\\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}&quot;
&quot;InfoTip&quot;=&quot;Содержит сжатые файлы&quot;

[HKEY_CLASSES_ROOT\.cab\PersistentHandler]
@=&quot;{098f2470-bae0-11cd-b579-08002b30bfeb}&quot;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-05-13T11:15:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=22909#p22909</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: работа с CAB архивами]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=20657#p20657" />
			<content type="html"><![CDATA[<p>Бесплатный COM-сервер <a href="http://www.jsware.net/jsware/scripts.php5#jscab">jsCAB Component</a> предоставляет методы для работы с CAB файлами: создание и распаковка, получение информации о файле и преобразование самораспаковывающегося EXE CAB файла в нормальный CAB файл. Дистрибутив (архив) компонента имеет размер около 80 Кб. Пример:<br /></p><div class="codebox"><pre><code>Set oCAB = CreateObject(&quot;jsCAB.Ops&quot;)
&#039; создание архива:
suc = oCAB.MakeCABFile(&quot;C:\Temp\test.cab&quot;, &quot;C:\Temp\test1.jpg|C:\Temp\test2.jpg&quot;)
&#039; получение информации об архиве:
Set oInfo = oCAB.GetCABInfo(&quot;C:\Temp\test.cab&quot;)
WScript.Echo oInfo.Path
WScript.Echo oInfo.IsValidCAB &#039; 0 - normal, 1 - InstallShield CAB, 2 - not a CAB
WScript.Echo oInfo.Solitary &#039; True - stand-alone CAB
&#039; обход содержимого:
For i = 0 to oInfo.FileCount - 1
   WScript.Echo oInfo.FileName(i) &#039; имя файла
   WScript.Echo oInfo.FileDate(i) &#039; дата изменения
   WScript.Echo oInfo.FileSize(i) &#039; размер в Кб
Next
WScript.Echo oInfo.FileExists(&quot;test2.jpg&quot;) &#039; проверка существования файла
&#039; ещё один способ обхода содержимого:
For i = 0 to UBound(oInfo.FileList)
    WScript.Echo oInfo.FileName(i)
Next
For Each el In oInfo.FileList
    WScript.Echo el
Next
&#039; извлечение из архива указанного файла:
suc = oCAB.ExtractSingleFile(&quot;C:\Temp\test.cab&quot;, &quot;C:\Temp\Testing&quot;, &quot;test1.jpg&quot;)
&#039; распаковка архива:
suc = oCAB.ExtractCABFiles(&quot;C:\Temp\test.cab&quot;, &quot;C:\Temp\Testing&quot;)</code></pre></div><p>См. также <a href="http://forum.script-coding.com/viewtopic.php?id=296">WSH: архивация файлов средствами операционной системы (WinXP)</a>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-03-14T10:57:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=20657#p20657</id>
		</entry>
</feed>
