Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Использование файла с русскими символами в .bat (http://forum.oszone.net/showthread.php?t=340840)

vdvas 07-06-2019 22:14 2874822

Использование файла с русскими символами в .bat
 
Здравствуйте.
Взял два скрипта с этого сайта, для бэкапа revit server.
https://ecognosci.wordpress.com/2014...server-models/
Смысл первого скрипта в том что он записывает в текстовый файл все пути к директориям, обрезает определенное количество первых символов и удаляет пробел. После этого вызывает второй скрипт который использует как аргумент строки из текстового файла.
Ниже мои версии скриптов.
Проблема в том что при вызове команды
"C:\Program Files\Autodesk\Revit Server 2015\Tools\RevitServerToolCommand\revitservertool.exe" createLocalRVT %1 -s server -d %bakdst% -o
появляются кракозябры и ничего не работает.
Сами скрипты имеют кодировку oem 866.
Может надо перекодировать получившийся файл RS2016Projectlist.txt в другую кодировку? Кодировка этого файла ANSI.
listing.bat
Код:

chcp 1251
set listfile=c:\share\RS2016Projectlist.txt
set backupscript=c:\script\RS2016Backup.cmd
set revitserverprojectpath=D:\Revit Server 2018\Projects
if exist %listfile% del %listfile% /q/f
for /R "%revitserverprojectpath%" %%f in (*.rvt) do (
set tmp=%%~pf
setlocal enableDelayedExpansion

rem The first 49 characters are truncated to remove the absolute path, and the
rem trailing slash is removed.

echo !tmp:~28,-1! >> %listfile%
endlocal
)
rem replace the trailing space
CScript //H:CScript
cscript “replacetext.vbs” “%listfile%” “.rvt ” “.rvt” /I

rem now parse through Revit model list and run backup script
for /f  "eol=; tokens=* delims=" %%1 in (c:\share\RS2016Projectlist.txt) do c:\share\revit_server_bak.cmd "%%1"

replacetext.vbs
Код:

‘Replace Text

‘This script should be placed in a folder specified in your system’s PATH variable.

‘Usage (WScript):
‘ReplaceText FileName OldText NewText [/i]

‘ /I (optional) – Text matching is not case sensitive

Set oArgs = WScript.Arguments

intCaseSensitive = 0
For i = 3 to oArgs.Count-1
If UCase(oArgs(i)) = “/I” Then intCaseSensitive = 1
Next

Set oFSO = CreateObject(“Scripting.FileSystemObject”)

If Not oFSO.FileExists(oArgs(0)) Then
WScript.Echo “Specified file does not exist.”
Else
Set oFile = oFSO.OpenTextFile(oArgs(0), 1)
strText = oFile.ReadAll
oFile.Close
strText = Replace(strText, oArgs(1), oArgs(2), 1, -1, intCaseSensitive)

Set oFile = oFSO.OpenTextFile(oArgs(0), 2)
oFile.WriteLine strText
oFile.Close
End If

revit_server_bak.cmd
Код:

chcp 1251
rem remove quotes fed by parse command and concatenate new UNC target path
set badpath=%1
set rvtroot=%badpath:~1,-1%
set unctarget=\\filesrv\share
set bakdst=”%unctarget%%rvtroot%”
rem use createlocalRVT tool to backup to network location
"C:\Program Files\Autodesk\Revit Server 2015\Tools\RevitServerToolCommand\revitservertool.exe" createLocalRVT %1 -s server -d %bakdst% -o


alpap 08-06-2019 22:35 2874912

Цитата:

Цитата vdvas
скрипты имеют кодировку oem 866 »

Цитата:

Цитата vdvas
...Кодировка этого файла ANSI »

а должна быть тоже OEM 866.

mwz 08-06-2019 22:59 2874917

alpap, я вот всё с сомнением смотрю на строки
Цитата:

Цитата vdvas
chcp 1251 »

Старею видать...

vdvas 10-06-2019 17:11 2875083

В консоли кракозябы но создаваемые файлы и аппки нормально по русски отображает.
Мне этого достаточно. Кракозябы в консоли не сильно критичны.

megaloman 10-06-2019 21:10 2875120

vdvas,
Цитата:

Цитата vdvas
c:\share\RS2016Projectlist.txt »

Предоставьте, пожалуйста, этот файл живьем, тыкать пальцем в небо можно долго.

Sham 11-06-2019 08:27 2875152

OpenTextFile по умолчанию ASCII. ANSI видимо -2 (4 параметр)

Iska 13-06-2019 23:26 2875521

Цитата:

Цитата Sham
ANSI видимо -2 (4 параметр) »

Нет, ANSI — это как раз «omitted» или же TristateFalse = 0. А TristateUseDefault = -2 даёт достаточно своеобразный эффект. Например:
Скрытый текст
Код:

Option Explicit

' IOMode Enum
Const ForReading  = 1
Const ForWriting  = 2
Const ForAppending = 8

' Format Enum
Const TristateUseDefault = -2
Const TristateTrue      = -1
Const TristateFalse      =  0


Dim strFile

With WScript.CreateObject("Scripting.FileSystemObject")
        For Each strFile In Array("ANSI-1251.txt", "UTF-16LE-1200.txt", "UTF-16LE-1200 BOM.txt")
                WScript.Echo strFile
               
                With .OpenTextFile(strFile)
                        WScript.Echo .ReadAll()
                        .Close
                End With
               
                With .OpenTextFile(strFile, ForReading, False, TristateUseDefault)
                        WScript.Echo .ReadAll()
                        .Close
                        WScript.Echo
                End With
        Next
End With

WScript.Quit 0




Время: 05:24.

Время: 05:24.
© OSzone.net 2001-