~scriptsvbs
3 itemsDownload ./*

..
onedrivesub.vbs
packmeta.vbs
unpackmeta.vbs


vbspackmeta.vbs
5 KB• 8•  20 hours ago•  DownloadRawClose
20 hours ago•  8

{}
Option Explicit 'force all variables to be declared
'
' intent for this script is to pack all unity .meta files into one directory that can be zipped
' and transferred as a single file rather than 1000s of tiny files between every other file.
'
' simply place in project folder next to Assets, run packmeta.vbs and ensure no interrupt.
' verify content of metapack.txt (db) and files in metapack\, and creation of metapack.lock.
'
' zip metapack and metapack.txt, bring with the .lock and .vbs scripts etc within or not~.
' delete the non-zipped metapack\ directory and transfer the project folder with the zip.
'
' on new destionation, do Not run packmeta, .lock will prevent it as well if brought (required)
' but do run unpackmeta.vbs in the same directory next to Assets and metapack with metapack.txt
'
' confirm the metapack directory is emptied after unpack, .lock and .txt is removed.
' all .meta should now be reinstated in the correct directory with correct names.
'
'						This script was made by Twily/Analie Oct 2025
'								This script is the packmeta.vbs
'
Const ForReading = 1
Const ForWriting = 2
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim objTS 'Text Stream Object
Set objTS = FSO.OpenTextFile("metapack.txt", ForWriting, True)

Dim WorkingPath
Dim CanonicalPath
Dim RelativePath
Dim printOnce
printOnce = 0
Dim lastIndexOfBackSlash
Dim ProjectName
Dim hashName
Dim stopExec
stopExec = 0
Dim DestinationFile
Dim SourceFile

Dim strNextLine
Dim arrServiceList
Dim i
Dim lineC
lineC = 0

Recurse FSO.GetFolder("test\")
objTS.Close()

' after exec read through db file, deletes real metas (keeping metapack only!)
Set objTS = FSO.OpenTextFile("metapack.txt", ForReading)
Do Until objTS.AtEndOfStream
	strNextLine = objTS.Readline
	arrServiceList = Split(strNextLine , ",")
	If lineC >= 2 Then
		'Wscript.Echo lineC & "] hashed: " & "metapack\" + arrServiceList(0) & ".meta"
		For i = 1 to Ubound(arrServiceList)
			'Wscript.Echo "real: " & arrServiceList(i)
			FSO.DeleteFile(arrServiceList(i)) 'DELETES ORIGINAL
		Next
	End If
	lineC = lineC + 1
Loop
objTS.Close()

Sub CreateLockfile
   Dim objLC
   Set objLC = FSO.CreateTextFile("metapack.lock", True)
   objLC.WriteLine("packmeta.vbs has been executed, this file is in place to prevent overwriting/wiping contents of metapack directory, see metapack.txt")
   objLC.Close
End Sub

Private Function SHA1(s)
    Dim asc, enc, bytes, outstr, pos
    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = asc.GetBytes_4(s) 'This is how you use .Net overloaded methods in VBScript
    bytes = enc.ComputeHash_2((bytes))
    outstr = ""
    'Convert the byte array to a hex string
    For pos = 1 To Lenb(bytes)
        outstr = outstr & LCase(Right("0" & Hex(Ascb(Midb(bytes, pos, 1))), 2))
    Next
    SHA1 = outstr
    Set asc = Nothing
    Set enc = Nothing
End Function

' initial scan and copy, write db file etc
Sub Recurse(objFolder)
    Dim objFile, objSubFolder
	
	If printOnce = 0 Then
		If (FSO.FileExists("metapack.lock")) Then
			MsgBox("metapack.lock file exists, exiting sub. delete or unpack first!")
			stopExec = 1
			Exit Sub
		End If
		If NOT (FSO.FolderExists("metapack")) Then
			FSO.CreateFolder("metapack")
		Else
			MsgBox("directory metapack already exists, exiting sub. delete or unpack first!")
			stopExec = 2
			Exit Sub
		End If
		
		If Not stopExec = 0 Then Exit Sub
		
		CreateLockfile()
		
		WorkingPath = FSO.GetAbsolutePathName(".")
		objTS.WriteLine(WorkingPath + "\")
		printOnce = 1
		lastIndexOfBackSlash = InStrRev(WorkingPath,"\")
		ProjectName = Mid(WorkingPath,lastIndexOfBackSlash + 1)
		objTS.WriteLine(ProjectName)
	End If

    For Each objFile In objFolder.Files
        If LCase(FSO.GetExtensionName(objFile.Name)) = "meta" Then
			CanonicalPath = FSO.GetAbsolutePathName(objFile)
			RelativePath = Mid(CanonicalPath,Len(WorkingPath) + 2)
            'objTS.WriteLine(WorkingPath + " " + CanonicalPath)
			hashName = SHA1(RelativePath)
			objTS.WriteLine(hashName + "," + RelativePath)
			SourceFile = RelativePath
			DestinationFile = "metapack\" + hashName + ".meta"
			
			If FSO.FileExists(DestinationFile) Then
				'Check to see if the file is read-only
				If Not FSO.GetFile(DestinationFile).Attributes And 1 Then 
					'The file exists and is not read-only.  Safe to replace the file.
					FSO.CopyFile SourceFile, DestinationFile, True
				Else 
					'The file exists and is read-only.
					'Remove the read-only attribute
					FSO.GetFile(DestinationFile).Attributes = FSO.GetFile(DestinationFile).Attributes - 1
					'Replace the file
					FSO.CopyFile SourceFile, DestinationFile, True
					'Reapply the read-only attribute
					FSO.GetFile(DestinationFile).Attributes = FSO.GetFile(DestinationFile).Attributes + 1
				End If
			Else
				'The file does not exist in the destination folder.  Safe to copy file to this folder.
				FSO.CopyFile SourceFile, DestinationFile, True
			End If
        End If
    Next

    For Each objSubFolder In objFolder.SubFolders
        Recurse objSubFolder
    Next
End Sub

Top
©twily.info 2013 - 2025
twily at twily dot info



2 471 727 visits
... ^ v