0

Готовим файлы перед миграцией в Sharepoint

Ни для кого не секрет, что в Sharepoint’е есть довольно — таки большой список ограничений на расширения файлов и специальные символы в названиях.

Перебирать вручную несколько тысяч файлов очень тяжело, и я для себя написал небольшой скрипт на Autoit’e, который просматривает указанную папку и убирает все запрещенные символы из имён файлов и папок, а так же добавляет расширение .illegal к запрещённым типам файлов.

Для каждой найденой ошибки пишется лог в папке со скриптом.

Итак, сам код:

#include <array.au3>
#include <file.au3>


FileDelete(@ScriptDir & "\ОШИБКИ.txt")
FileDelete(@ScriptDir & "\OK.txt")
FileOpen(@ScriptDir & "\ОШИБКИ.txt", 136)
FileOpen(@ScriptDir & "\OK.txt", 136)

$pattern2 = '.*?\~|.*?\#|.*?\%|.*?\&|.*?\*|.*?\{|.*?\}|.*? \<|.*?\>|.*?\?|.*?\/|.*?\+|.*?\||.*?\"'
$pattern3 = '\~|\#|\%|\&|\*|\{|\}|\<|\>|\?|\/|\+|\"'
$pattern = ".*?(\.ashx)|.*?(\.asmx)|.*?(\.asp)|.*?(\.aspq)|.*?(\.axd)|.*?(\.cshtm)|.*?(\.chtml)|.*?(\.json)|.*?(\.rem)|.*?(\.shtm)|.*?(\.shtml)|.*?(\.soap)|.*?(\.stm)|.*?(\.svc)|.*?(\.vbhtm)|.*?(\.vbhtml)|.*?(\.xamlx)|.*?(\.ade)|.*?(\.adp)|.*?(\.asa)|.*?(\.ashx)|.*?(\.asmx)|.*?(\.asp)|.*?(\.bas)|.*?(\.bat)|.*?(\.cdx)|.*?(\.cer)|.*?(\.chm)|.*?(\.class)|.*?(\.cmd)|.*?(\.com)|.*?(\.config)|.*?(\.cnt)|.*?(\.cpl)|.*?(\.crt)|.*?(\.csh)|.*?(\.der)|.*?(\.dll)|.*?(\.exe)|.*?(\.fxp)|.*?(\.gadget)|.*?(\.grp)|.*?(\.hlp)|.*?(\.hpj)|.*?(\.hta)|.*?(\.htr)|.*?(\.htw)|.*?(\.ida)|.*?(\.idc)|.*?(\.idq)|.*?(\.ins)|.*?(\.isp)|.*?(\.its)|.*?(\.jse)|.*?(\.json)|.*?(\.ksh)|.*?(\.lnk)|.*?(\.mad)|.*?(\.maf)|.*?(\.mag)|.*?(\.mam)|.*?(\.maq)|.*?(\.mar)|.*?(\.mas)|.*?(\.mat)|.*?(\.mau)|.*?(\.mav)|.*?(\.maw)|.*?(\.mcf)|.*?(\.mda)|.*?(\.mdb)|.*?(\.mde)|.*?(\.mdt)|.*?(\.mdw)|.*?(\.mdz)|.*?(\.ms-one-stub)|.*?(\.msc)|.*?(\.msh)|.*?(\.msh1)|.*?(\.msh1xml)|.*?(\.msh2)|.*?(\.msh2xml)|.*?(\.mshxml)|.*?(\.msi)|.*?(\.msp)|.*?(\.mst)|.*?(\.ops)|.*?(\.pcd)|.*?(\.pif)|.*?(\.pl)|.*?(\.prf)|.*?(\.prg)|.*?(\.printer)|.*?(\.ps1)|.*?(\.ps1xml)|.*?(\.ps2)|.*?(\.ps2xml)|.*?(\.psc1)|.*?(\.psc2)|.*?(\.pst)|.*?(\.reg)|.*?(\.rem)|.*?(\.scf)|.*?(\.scr)|.*?(\.sct)|.*?(\.shb)|.*?(\.shs)|.*?(\.shtm)|.*?(\.shtml)|.*?(\.soap)|.*?(\.stm)|.*?(\.svc)|.*?(\.url)|.*?(\.vb)|.*?(\.vbe)|.*?(\.vbs)|.*?(\.vsix)|.*?(\.ws)|.*?(\.wsc)|.*?(\.wsf)|.*?(\.wsh)|.*?(\.xamlx)"
open_dir()

Func open_dir()
	Local Const $smessage = "Select a folder"
	Global $sfileselectfolder = FileSelectFolder($smessage, "")
	If @error Then
		MsgBox($mb_systemmodal, "", "No folder was selected.")
		Exit
	Else
		MsgBox($mb_systemmodal, "", "You chose the following folder:" & @CRLF & $sfileselectfolder)
	EndIf
EndFunc

$Longerror = 0
$Nameerror = 0
$Shorterror = 0
$Typeerror = 0
$okfiles = 0
$n = 0
$t = 0
Dim $filearray[1000000]
Global $way = StringLen($sfileselectfolder)
_filelist($sfileselectfolder)

Func _filelist($sfileselectfolder)
	$search = FileFindFirstFile($sfileselectfolder & "\*.*")
	If $search = -1 Then Return -1
	While 1
		$n = $n + 1
		$file = FileFindNextFile($search)
		If @error Then
			FileClose($search)
			Return
		ElseIf $file = "." OR $file = ".." Then
			ContinueLoop
		ElseIf StringInStr(FileGetAttrib($sfileselectfolder & "\" & $file), "D") Then
			_filelist($sfileselectfolder & "\" & $file)
		EndIf
		$filearray[$n] = ($sfileselectfolder & "\" & $file)
		$full = StringLen(FileGetLongName($filearray[$n])) - $way
		$short = StringLen($file)
		If $full > 256 Then
			$t = $t + 1
			FileWrite(@ScriptDir & "\ОШИБКИ.txt", "Слишком длинный путь к файлу ("&$full&")/256 - " & $filearray[$n]  & @CRLF)
			$Longerror = $Longerror +1
		EndIf
		If $short > 127 Then
			$t = $t + 1
			FileWrite(@ScriptDir & "\ОШИБКИ.txt", "Слишком длинное имя файла ("&$full&")/127 - " & $filearray[$n] & @CRLF)
			$Shorterror = $Shorterror +1
		EndIf
		If StringRegExp($filearray[$n], $pattern) = 1 Then
			;ConsoleWrite($filearray[$n] & " GET IT" & @CRLF)
			FileMove($filearray[$n], $filearray[$n] & ".illegal", 8)
			FileWrite(@ScriptDir & "\ОШИБКИ.txt", "Запрещённый тип файла! - " & $filearray[$n] & @CRLF)
			$Typeerror = $Typeerror + 1
		Else
			FileWrite(@ScriptDir & "\OK.txt", " ОК" & $filearray[$n] &  @CRLF)
			$okfiles = $okfiles +1
		EndIf
		If StringRegExp($filearray[$n], $pattern2) = 1 Then
			;ConsoleWrite($filearray[$n] & " GET IT" & @CRLF)
			$new = StringRegExpReplace($filearray[$n], $pattern3, "")
			;ConsoleWrite($new)
			FileMove($filearray[$n], $new, 8)
			FileWrite(@ScriptDir & "\ОШИБКИ.txt", "Запрещённые символы в имени файла или папки " & $filearray[$n] & " Должно быть: " & $new & @CRLF)
			$Nameerror = $Nameerror + 1
		EndIf
	WEnd
EndFunc

FileClose(@ScriptDir & "\ОШИБКИ.txt")
FileClose(@ScriptDir & "\OK.txt")

MsgBox(4096, "Отчёт", "Всё сделано" &@CRLF& "Всего файлов и папок проанализировано "&$n&@CRLF &"Файов с запрещёнными символами: "&$Nameerror&@CRLF&"Слишком длинные пути к файлу: "&$Longerror&@CRLF&"Слишком длинное имя файла: "&$Shorterror&@CRLF&"Запрещённых файлов: "&$Typeerror)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *