VBSCRIPT to localize revit INI settings to current user (Points to MyDocs folders)
Option Explicit
Dim Wscript ''As New objWSCRIPT_Emulator '' GLOBAL initiated in Main - also For
Debug in Excel
Debug in Excel
Dim objFSO ''As New FileSystemObject - '' GLOBAL initiated in MAIN
Dim intTristate ''if file is unicode this variable helpw sith read/write
Const TristateTrue =
-1
-1
Const TristateFalse =
0
0
Const ForReading =
1
1
Const ForWriting =
2
2
Const ForAppending =
8
8
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Make changes in MainResetUserINI() Subroutine.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
MainResetUserINI ''runs the function to execute the change in the ini
Sub MainResetUserINI()
Dim objNetwork
Set objNetwork =
CreateObject("Wscript.Network")
CreateObject("Wscript.Network")
If MsgBox("WARNING: This will change Revit data File paths to
'" & UCase(objNetwork.UserName)
& "'s folders." & _
'" & UCase(objNetwork.UserName)
& "'s folders." & _
vbCr &
_
_
vbCr &
_
_
"Typically modificatios in clude repathing for the
Project Path, RootFileFor PointClouds, etc. " & _
Project Path, RootFileFor PointClouds, etc. " & _
vbCr &
_
_
vbCr &
_
_
vbCr &
_
_
"Once run this cannot be undone - Continue?", _
vbYesNo + vbExclamation, _
"Revit localize Reference Folders To " & objNetwork.UserName & " User Profile") _
<>
vbYes Then
vbYes Then
MsgBox
"Exiting- no changes made"
"Exiting- no changes made"
Exit Sub
End If
'''''''''''''''''''''''''
''''GLOBAL INITIALIZE''''
Set Wscript =
CreateObject("WScript.Shell") ''Sets GLOBAL WSCRIPT for use in all functions/subs
CreateObject("WScript.Shell") ''Sets GLOBAL WSCRIPT for use in all functions/subs
Set objFSO = CreateObject("Scripting.FileSystemObject") ''Sets GLOBAL File System Object for use in all
functions/subs
functions/subs
''''GLOBAL INITIALIZE END'''
''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Local Filepath references
Dim strREVITlocalProjectPath ''local destination for 'local' project files
Dim fpRevitINI ''Revit INI file location
''Revit INI location- can be reset to scan for multiple versions
(2015, 2016, etc)
(2015, 2016, etc)
fpRevitINI =
Wscript.ExpandEnvironmentStrings("%APPDATA%") & "\Autodesk\Revit\Autodesk Revit 2016\Revit.ini"
Wscript.ExpandEnvironmentStrings("%APPDATA%") & "\Autodesk\Revit\Autodesk Revit 2016\Revit.ini"
''Set local project path relative to User's
"MyDocuments"
"MyDocuments"
strREVITlocalProjectPath = Wscript.SpecialFolders("MyDocuments") & "\Revit\Revit_LOCAL_PROJ\"
''Reset [directiories] ProjectPath
WriteIni
fpRevitINI, "Directories", "ProjectPath", strREVITlocalProjectPath
fpRevitINI, "Directories", "ProjectPath", strREVITlocalProjectPath
''Reset [directiories] RootPathForPointClouds
WriteIni
fpRevitINI, "Directories", "RootPathForPointClouds",
strREVITlocalProjectPath
fpRevitINI, "Directories", "RootPathForPointClouds",
strREVITlocalProjectPath
Set objFSO = Nothing
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
MsgBox "completed changes. Plesae re-open Revit to see
changes."
changes."
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''DO NOT EDIT BELOW THIS LINE- MAKE CHANGES IN
MainResetUserINI''''''''''''''''''''''
MainResetUserINI''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Begin INI reading code matrix
''Probably don't need to edit anything below this line
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Borrowed from:
'''http://www.robvanderwoude.com/vbstech_files_ini.php
''Ron E. Allen added functions for unicode INI files 2016
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ReadIni(myFilePath,
mySection, myKey)
mySection, myKey)
' This function returns a value read from an INI file
'
' Arguments:
' myFilePath
[string] the (path and) file name
of the INI file
[string] the (path and) file name
of the INI file
' mySection
[string] the section in the INI
file to be searched
[string] the section in the INI
file to be searched
' myKey
[string] the key whose value is
to be returned
[string] the key whose value is
to be returned
'
' Returns:
' the [string] value for the specified key in the
specified section
specified section
'
' CAVEAT: Will
return a space if key exists but value is blank
return a space if key exists but value is blank
'
' Written by Keith Lacelle
' Modified by Denis St-Pierre and Rob van der Woude And
Ron E. Allen
Ron E. Allen
Dim intEqualPos
Dim ObjIniFile
Dim strFilePath, strKey,
strLeftString, strLine, strSection
strLeftString, strLine, strSection
ReadIni =
""
""
strFilePath =
Trim(myFilePath)
Trim(myFilePath)
strSection =
Trim(mySection)
Trim(mySection)
strKey =
Trim(myKey)
Trim(myKey)
If objFSO.FileExists(strFilePath)
Then
Then
CheckSetUnicode (strFilePath)
Set ObjIniFile =
objFSO.OpenTextFile(strFilePath, ForReading, False, intTristate) ''tristatetrue
opens unicode file tristatefalse opens as ascII which may add nulls between
characters
objFSO.OpenTextFile(strFilePath, ForReading, False, intTristate) ''tristatetrue
opens unicode file tristatefalse opens as ascII which may add nulls between
characters
Do While
ObjIniFile.AtEndOfStream = False
ObjIniFile.AtEndOfStream = False
strLine =
Trim(ObjIniFile.ReadLine)
Trim(ObjIniFile.ReadLine)
' Check if section is found in the current line
If LCase(strLine)
= "[" & LCase(strSection) &
"]" Then
= "[" & LCase(strSection) &
"]" Then
strLine = Trim(ObjIniFile.ReadLine)
' Parse lines until the next section is reached
Do While Left(strLine,
1) <> "["
1) <> "["
' Find position of equal sign in the line
intEqualPos = InStr(1, strLine,
"=", 1)
If intEqualPos > 0 Then
strLeftString = Trim(Left(strLine, intEqualPos
- 1))
' Check if item is found in
the current line
If LCase(strLeftString) = LCase(strKey)
Then
ReadIni = Trim(Mid(strLine,
intEqualPos + 1))
' In case the item exists but
value is blank
If ReadIni = "" Then
ReadIni =
" "
" "
End If
' Abort loop when item is
found
Exit Do
End If
End If
' Abort if the end of the INI file is reached
If ObjIniFile.AtEndOfStream Then Exit Do
' Continue with next line
strLine = Trim(ObjIniFile.ReadLine)
Loop
Exit Do
End If
Loop
ObjIniFile.Close
Else
Wscript.Echo
strFilePath & " doesn't exists.
Exiting..."
strFilePath & " doesn't exists.
Exiting..."
Wscript.quit
1
1
End If
End Function
Sub WriteIni(myFilePath,
mySection, myKey, myValue)
mySection, myKey, myValue)
' This subroutine writes a value to an INI file
'
' Arguments:
' myFilePath
[string] the (path and) file name
of the INI file
[string] the (path and) file name
of the INI file
' mySection
[string] the section in the INI
file to be searched
[string] the section in the INI
file to be searched
' myKey
[string] the key whose value is
to be written
[string] the key whose value is
to be written
' myValue
[string] the value to be written
(myKey will be
[string] the value to be written
(myKey will be
'
deleted if myValue is <DELETE_THIS_VALUE>)
deleted if myValue is <DELETE_THIS_VALUE>)
'
' Returns:
' N/A
'
' CAVEAT:
WriteIni function needs ReadIni function to run
WriteIni function needs ReadIni function to run
'
' Written by Keith Lacelle
' Modified by Denis St-Pierre, Johan Pol and Rob van der
Woude
Woude
Const ForReading =
1
1
Const ForWriting =
2
2
Const ForAppending =
8
8
Dim blnInSection,
blnKeyExists, blnSectionExists, blnWritten
blnKeyExists, blnSectionExists, blnWritten
Dim intEqualPos
Dim objNewIni, objOrgIni,
wshShell
wshShell
Dim strFilePath,
strFolderPath, strKey, strLeftString
strFolderPath, strKey, strLeftString
Dim strLine, strSection,
strTempDir, strTempFile, strValue
strTempDir, strTempFile, strValue
strFilePath =
Trim(myFilePath)
Trim(myFilePath)
strSection =
Trim(mySection)
Trim(mySection)
strKey =
Trim(myKey)
Trim(myKey)
strValue =
Trim(myValue)
Trim(myValue)
Set wshShell =
CreateObject("WScript.Shell")
CreateObject("WScript.Shell")
strTempDir =
wshShell.ExpandEnvironmentStrings("%TEMP%")
wshShell.ExpandEnvironmentStrings("%TEMP%")
strTempFile =
objFSO.BuildPath(strTempDir, objFSO.GetTempName)
objFSO.BuildPath(strTempDir, objFSO.GetTempName)
CheckSetUnicode (strFilePath)
Set objOrgIni =
objFSO.OpenTextFile(strFilePath, ForReading, True, intTristate)
objFSO.OpenTextFile(strFilePath, ForReading, True, intTristate)
If objFSO.FileExists(strTempFile)
Then
objFSO.DeleteFile strTempFile
Then
objFSO.DeleteFile strTempFile
Set objNewIni =
objFSO.CreateTextFile(strTempFile, False, intTristate)
objFSO.CreateTextFile(strTempFile, False, intTristate)
blnInSection =
False
False
blnSectionExists
= False
= False
' Check if the specified key already exists
blnKeyExists =
(ReadIni(strFilePath, strSection, strKey) <>
"")
(ReadIni(strFilePath, strSection, strKey) <>
"")
blnWritten =
False
False
' Check if path to INI file exists, quit if not
strFolderPath =
Mid(strFilePath, 1, InStrRev(strFilePath,
"\"))
Mid(strFilePath, 1, InStrRev(strFilePath,
"\"))
If Not objFSO.FolderExists(strFolderPath)
Then
Then
Wscript.Echo
"Error: WriteIni failed, folder path
(" _
"Error: WriteIni failed, folder path
(" _
&
strFolderPath & ") to ini
file " _
strFolderPath & ") to ini
file " _
&
strFilePath & " not found!"
strFilePath & " not found!"
Set objOrgIni = Nothing
Set objNewIni = Nothing
Wscript.quit
1
1
End If
While
objOrgIni.AtEndOfStream = False
objOrgIni.AtEndOfStream = False
strLine =
Trim(objOrgIni.ReadLine)
Trim(objOrgIni.ReadLine)
If blnWritten = False Then
If LCase(strLine)
= "[" & LCase(strSection) &
"]" Then
= "[" & LCase(strSection) &
"]" Then
blnSectionExists = True
blnInSection = True
ElseIf InStr(strLine,
"[") = 1 Then
"[") = 1 Then
blnInSection = False
End If
End If
If blnInSection Then
If blnKeyExists Then
intEqualPos = InStr(1, strLine,
"=", vbTextCompare)
If intEqualPos > 0 Then
strLeftString = Trim(Left(strLine,
intEqualPos - 1))
If LCase(strLeftString)
= LCase(strKey) Then
= LCase(strKey) Then
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
blnWritten = True
blnInSection = False
End If
End If
If Not blnWritten Then
objNewIni.WriteLine strLine
End If
Else
objNewIni.WriteLine strLine
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
blnWritten = True
blnInSection = False
End If
Else
objNewIni.WriteLine strLine
End If
Wend
If blnSectionExists = False Then ' section doesn't exist
objNewIni.WriteLine
objNewIni.WriteLine "[" & strSection & "]"
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
End If
objOrgIni.Close
objNewIni.Close
' Delete old INI file
objFSO.DeleteFile strFilePath, True
' Rename new INI file
objFSO.MoveFile
strTempFile, strFilePath
strTempFile, strFilePath
Set objOrgIni = Nothing
Set objNewIni = Nothing
Set wshShell = Nothing
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''Ron Allen Functions
Function IsUnicode(strFilePath)
''As Boolean
''As Boolean
''Set objFSO =
CreateObject("Scripting.FileSystemObject") ''create fso
CreateObject("Scripting.FileSystemObject") ''create fso
Dim ObjTestFile
Set ObjTestFile =
objFSO.OpenTextFile(strFilePath, ForReading, False)
objFSO.OpenTextFile(strFilePath, ForReading, False)
Dim char1, char2
char1 =
ObjTestFile.Read(1)
ObjTestFile.Read(1)
char2 =
ObjTestFile.Read(1)
ObjTestFile.Read(1)
If Asc(char1) =
255 And Asc(char2) = 254 Then IsUnicode = True
255 And Asc(char2) = 254 Then IsUnicode = True
ObjTestFile.Close
''Set objFSO = Nothing
End Function
Function
CheckSetUnicode(strFilePath)
CheckSetUnicode(strFilePath)
If IsUnicode(strFilePath)
Then
Then
intTristate = TristateTrue
Else
intTristate = TristateFalse
End If
CheckSetUnicode =
intTristate
intTristate
End Function
Comments
Post a Comment