Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Текстовые файлы

Ответить
Настройки темы
CMD/BAT - Текстовые файлы

Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброе время!
Прошу помощи, для создания батника нужно в текстовый файл нужно удалить знак пробел перед знаком "]" это знак не везде встречается в текстовом файле.

Отправлено: 12:12, 09-08-2019

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата AKadekin:
Да, обрабатывается 1 файл. Имя этих файлов разное но расширение одно. »
[когнитивный диссонанс ON]
Он либо один, либо этих файлов больше чем один. Это взаимоисключающие условия.
[когнитивный диссонанс OFF]

Цитата AKadekin:
Файлы находятся в одной папке потом они перемещаются в разные папки.
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке.
После обработки перед перемещением их нужно переименовать в *.MIX (бывший *.AX1 - ложится в одну папку, другой в другую)
Эти файлы содержат разные данные но "структура" одинаковая. В этих файлах нужно перед знаком ] убрать пробел. Там всегда один пробел лишний.
Расположение папок фиксировано не меняется.
Все что нужно. »
powershell
Код: Выделить весь код
#requires -v 3.0
# путь к одному каталогу с файлами:
$fldin = 'z:\Путь_к_каталогу_с_файлами\Один_Каталог\*'
# путь к разным, целевым каталогам:
$fldout1 = 'z:\Путь_к_каталогу_с_файлами\AX1'
$fldout2 = 'z:\Путь_к_каталогу_с_файлами\MX1'
# если не существуют, то создаем:
if(!(test-path $fldout1)){md $fldout1|out-null}
if(!(test-path $fldout2)){md $fldout2|out-null}
# фильтр файлов по расширению:
$inc = '*.AX1','*.MX1'
# расширение для переименования:
$ext = '.MIX'
# кодировка:
$enc = 'utf8'

dir $fld -inc $inc -file|%{
	$file = $_
	$tmp = (gc $_.fullname -raw -enc $enc) -replace ' \]',']'
	$tmp|sc $file.fullname -enc $enc
	if ($_.extension -eq '.AX1'){
		mi $_.fullname ("$fldout1\" + $_.basename + $ext)
	} else {
		mi $_.fullname ("$fldout2\" + $_.basename + $ext)
	}
	
}

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 10-08-2019 в 13:08.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:00, 10-08-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Это пример одного файлов они по структуре похоже, отличаются только внутренними данными.

Код: Выделить весь код
[Descrittore]
Nome=1023022
Descrizione=Klaes
Id=1
Numero record=27  
Ora di Inizio=01/01/2001 23.23.59
Ora di Fine=01/01/2001 23.23.59
[TEIL]
[Record Nr.0 ]
Nr.Riga=1 
Id.Record=3014
Lunghezza=662.0 
Larghezza=102.0
Spessore=58.0
Quantita=1
Fattil1=0
Fattil2=0

Отправлено: 13:54, 10-08-2019 | #12


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


AKadekin,
VBS. Пропишите свои пути
Код: Выделить весь код
 FileIn = Array("Z:\Box_In", "AX1", "Z:\Box_Out1", "MIX", _
                "Z:\Box_In", "MX1", "Z:\Box_Out2", "MIX")

RegExp = "  *]"
Rep = "]"

NN = 4
N1 = LBound(FileIn)
N2 = UBound(FileIn)

ErrMsg = ""
For i = N1 To N2 Step NN
    Call Working(FileIn(i), FileIn(i + 1), FileIn(i + 2), FileIn(i + 3), RegExp, Rep, xDin, xOut, ErrMsg)
Next
'If ErrMsg <> "" Then MsgBox ErrMsg
If ErrMsg <> "" Then WScript.Echo ErrMsg
' =========================

Sub Working(Din, Ein, Dout, Eout, Rx, Rp, iDin, iDout, ErrM)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    If ExistDir(FSO, Din, iDin, ErrM) And ExistDir(FSO, Dout, iOut, ErrM) Then
        Set RegFile = CreateObject("VBScript.RegExp")
        RegFile.Pattern = "^.*\." + Ein + "$"
        RegFile.IgnoreCase = True
        
        For Each jF In iDin.Files
            If RegFile.Test(jF.Name) Then
                If Retxt(FSO, jF, txt, Rx, Rp, ErrM) Then
                    Call Outtxt(FSO, jF, Dout + "\" + FSO.GetBaseName(jF) + "." + Eout, txt, ErrM)
                End If
            End If
        Next
    End If
End Sub

Function ExistDir(FSO, D, iD, ErrM)
    ExistDir = True
    On Error Resume Next
    
    Set iD = FSO.GetFolder(D)
    If Err.Number <> 0 Then
        ErrM = ErrM + "--- """ + D + """" + vbCrLf + "   Open folder. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
        ExistDir = False
    End If
    
    On Error GoTo 0
End Function

Function Retxt(FSO, fName, txt, RExp, RR, MS)
    Retxt = False
    On Error Resume Next
    
    With FSO.OpenTextFile(fName, 1)
        If Err.Number <> 0 Then
            MS = MS + "--- " + fName + vbCrLf + "    Error open file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Function
        End If
        txt = .ReadAll
        If Err.Number <> 0 Then
            MS = MS + "--- " + fName + vbCrLf + "    Error read file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Function
        End If
        .Close
    End With
    On Error GoTo 0
    
    With CreateObject("VBScript.RegExp")
        .Pattern = RExp
        .IgnoreCase = True
        .Global = True
        If Not .Test(txt) Then
''''''''''            MS = MS + "--- " + fName + vbCrLf + "    no replace." + "    Reg expression: " + """" + RExp + """" + vbCrLf
            Exit Function
        End If
        txt = .Replace(txt, RR)
    End With
    Retxt = True
End Function

Sub Outtxt(FSO, fIn, fOut, txt, MS)
    On Error Resume Next
    
    Set WW = FSO.CreateTextFile(fOut, True)
    If Err.Number <> 0 Then
            MS = MS + "--- " + fOut + vbCrLf + "    Error create file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Sub
    End If
    
    WW.Write txt
    If Err.Number <> 0 Then
            MS = MS + "--- " + fOut + vbCrLf + "    Error write in file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            WW.Close
            Exit Sub
    End If
    WW.Close
    
    Err.Number = 0
    If FSO.FileExists(fOut) Then Call FSO.DeleteFile(fIn, True)
    If Err.Number <> 0 Then
            MS = MS + "--- " + fIn + vbCrLf + "    Error delete file. Err.Number=" + CStr(Err.Number) + "  " + Err.Description + vbCrLf
            On Error GoTo 0
            Exit Sub
    End If
    On Error GoTo 0
End Sub
Лучше бы Вы заархивировали реальный файл и приложили к сообщению. Или, если он небольшой, переименуйте его в txt.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 10-08-2019 в 19:46.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:53, 10-08-2019 | #13


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать



В архиве находятся файлыDaten.zip

Отправлено: 10:15, 12-08-2019 | #14


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


AKadekin,
если просто пробел мозолит глаза, не проще убрать [] везде по тексту, потому как пробелы в конце строк встречаются и в строках не имеющих этих скобок.
(да, и нужны ли 17 пробелов между абзацами?), т.е. как в дальнейшем будет использоваться этот файл?

Отправлено: 11:48, 12-08-2019 | #15


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Вот CMD. Пустые строки съест. VBS работает намного быстрее, но пустые строки сохраняет. Конкретно требований насчёт пустых строк не было. И концевых пробелов тоже
Код: Выделить весь код
@Echo Off
	Call :ReMove "Z:\Box_In\*.AF1" "Z:\Box_Out1" "MIX" " ]" "]"
	Call :ReMove "Z:\Box_In\*.AX1" "Z:\Box_Out2" "MIX" " ]" "]"
Exit /B

:ReMove
	For %%f In (%1) Do (
		>"%~2\%%~nf.%~3" (FOR /F "usebackq delims=" %%s IN (`2^>nul More "%%f"`) DO (
			Call :Replace "%%s" %4 %5
		))
		If Exist "%~2\%%~nf.%~3" Del "%%f"
	)
Exit /B

:Replace
	Set "SS=%~1"
	:Begin
		Set "SSS=%SS%"
		Call Set "SS=%%SS:%~2=%~3%%"
	If /I Not "%SSS%"=="%SS%" GoTo :Begin
	Echo %SS%
Exit /B

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 12-08-2019 в 16:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:03, 12-08-2019 | #16


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Главное что бы до ] пробел убрать.
Структура должна быть сохранена и столько пробелов нужно.

Отправлено: 17:29, 14-08-2019 | #17


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Прошу помощи, для решения этой проблемы.

Отправлено: 08:05, 15-08-2019 | #18


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


AKadekin,
Офигеть... а всё, что предложено выше (cmd, wsh, powershell) - бредятина, которая Вам не помогла? Зачетно...


Хотя, да... в моем скрипте была опечатка в наименовании переменной...
Вот исправленный вариант:
Код: Выделить весь код
#requires -v 3.0
# путь к одному каталогу с файлами:
$fldin = 'z:\Путь_к_каталогу_с_файлами\Один_Каталог\*'
# путь к разным, целевым каталогам:
$fldout1 = 'z:\Путь_к_каталогу_с_файлами\AF1'
$fldout2 = 'z:\Путь_к_каталогу_с_файлами\AX1'
# если не существуют, то создаем:
if(!(test-path $fldout1)){md $fldout1|out-null}
if(!(test-path $fldout2)){md $fldout2|out-null}
# фильтр файлов по расширению:
$inc = '*.AF1','*.AX1'
# расширение для переименования:
$ext = '.MIX'
# кодировка:
$enc = 'utf8'

dir $fldin -inc $inc -file|%{
	$file = $_
	$tmp = (gc $_.fullname -raw -enc $enc) -replace ' \]',']'
	$tmp|sc $file.fullname -enc $enc
	if ($_.extension -eq '.AF1'){
		mi $_.fullname ("$fldout1\" + $_.basename + $ext)
	} elseif ($_.extension -eq '.AX1') {
		mi $_.fullname ("$fldout2\" + $_.basename + $ext)
	}
	
}
Но и Вы, при составлении условий не торопитесь, описывайте их полно и правильно, а то есть вот такое несоответствие:
Цитата AKadekin:
Файлы которые нужно обработать имеют расширения *.AX1 и *.MX1 и они находятся в одной папке. »
после чего показываете пример двух файлов, с таким наименованием:
1023000.AF1
1023000.AX1
что явно не соответствует *.AX1 и *.MX1

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 15-08-2019 в 09:15.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:32, 15-08-2019 | #19


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


AKadekin, что конкретно не устроило в этом моём решении? Оно полностью отвечает поставленной Вами задаче.
Код сохраните в файл с расширением .vbs.
Цитата:
FileIn = Array("Z:\Box_In", "AX1", "Z:\Box_Out1", "MIX", _
"Z:\Box_In", "MX1", "Z:\Box_Out2", "MIX")
Здесь надо прописать свои пути и расширения файлов по предложенному образцу.
Одна строка соответствует одному сценарию обработки.

Здесь в первой строке в кавычках:
В папке "Z:\Box_In"
Надо обработать все файлы с расширением "AX1"
Поместить обработанные в папку "Z:\Box_Out1"
При этом изменить им расширение на "MIX"

В чём трудность прописать свои данные?

Во второй строке аналогично для второго расширения файлов
И таких строк может быть сколько угодно (Вы заказали 2 варианта)
Запускаете скрипт как любой исполнимый файл.

Кстати, это решение можно поместить в назначенные задания, чтобы скрипт исполнялся с некоторой периодичностью без Вашего дополнительного вмешательства:
Cscript "Путь\имяскрипта.vbs"

В чем у Вас непонимание? Вы хоть раз пытались запустить этот скрипт?. Или иной из предложенных Вам решений? Какой при этом результат получили? Чтобы Вам помочь, нужна адекватная обратная связь, а пустые стенания
Цитата:
Прошу помощи, для решения этой проблемы.
после предложенных вариантов не дает возможности это сделать.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 15-08-2019 в 11:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:02, 15-08-2019 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Текстовые файлы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - как сравнить текстовые файлы в папке? rsersh Скриптовые языки администрирования Windows 1 04-06-2016 22:24
CMD/BAT - Как найти текстовые файлы yaoleg2 Скриптовые языки администрирования Windows 7 10-01-2013 21:23
Прочие - Текстовые файлы Bazaroff Программное обеспечение Windows 3 25-04-2010 21:39
Не открываются текстовые файлы и изображения и к ним создались файлы с расшир. drweb leda Лечение систем от вредоносных программ 1 03-10-2009 01:22
Delphi - Текстовые файлы в Delphi Borislav Программирование и базы данных 2 11-01-2005 13:18




 
Переход