Непечатные символы в именах файлов нарушают мой рекурсивный список файлов VB Script

Я создал скрипт VB для рекурсивного перечисления всех его файлов и подпапок. Сценарий начинается нормально, но в конечном итоге происходит сбой в любой папке, содержащей файл с непечатаемыми символами в именах файлов, т.е. я вижу маленькие квадраты, когда просматриваю папку в Проводнике. Я не уверен, как изменить мою обработку ошибок ниже, чтобы продолжить, когда он находит файл с такими символами.

Любые советы или решения будут оценены. Спасибо.

Set objFSO = CreateObject("Scripting.FileSystemObject")
strFolder = "C:\Input\"
Set objFolder = objFSO.GetFolder(strFolder)
Set NewFile = objFSO.CreateTextFile("C:\Output\" & objFolder.Name & " FileList.txt", True)
Set colFiles = objFolder.Files

On Error Resume Next

For Each objFile In colFiles
    NewFile.WriteLine(objFile.Path)
    If Err Then
        Err.Clear
    End If
Next

ShowSubFolders(objFolder)

Sub ShowSubFolders(objFolder)
    Set colFolders = objFolder.SubFolders

    For Each objSubFolder In colFolders
        Set colFiles = objSubFolder.Files
            For Each objFile In colFiles
                NewFile.WriteLine(objFile.Path)
                If Err Then
                    Err.Clear
                End If
            Next
        ShowSubFolders(objSubFolder)
    Next
End Sub

NewFile.Close

1 ответ

Создайте выходной текстовый файл как Unicode, чтобы он мог обрабатывать "непечатные" символы. Третий параметр CreateTextFile.

Set NewFile = objFSO.CreateTextFile(" ... ", True, True)

РЕДАКТИРОВАНИЕ

Если вы не можете работать с файлами Unicode, то имена файлов / папок должны быть преобразованы из Unicode в ANSI перед записью в выходной файл. Это сделает преобразование

Function Unicode2Ansi( text )
    Unicode2Ansi = text 
    With (WScript.CreateObject("ADODB.Stream"))
        ' Put data into stream
        .Type = 2 '( adTypeText )
        .Charset = "x-ansi"
        .Open
        .WriteText text
        'Retrieve data from stream
        .Position = 0
        Unicode2Ansi = .ReadText
        .Close
    End With 
End Function

И адаптировать код для его вызова NewFile.WriteLine Unicode2Ansi(objFile.Path)

Другие вопросы по тегам