PDA

Показать полную графическую версию : [решено] Скрипт vbs не могу настроить


Technik_spat
23-05-2022, 09:41
Форумчане, здравствуйте!
Подскажите, пожалуйста, что делаю не так.
Сама задача: при появлении нового файла (в данном случае TOVAR.txt, по сути это обычный txt со структурой csv), необходимо запустить обработку, которая заменит часть значений в файле.
Пытаюсь состряпать хоть что то, но вообще никуда не идёт, он просто висит в задачах, но не исполняется.
Сам скрипт и файл, который появляется при загрузке.
166667

Option Explicit: Dim FDir, File, FSO, SINK
FDir = Left(WSH.ScriptFullName, InStrRev(WSH.ScriptFullName, "\"))
File = FDir & "\\server_kass\Obmen\Spr\temp_not_delete\TOVAR.txt"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SINK = WSH.CreateObject("WbemScripting.SWbemSink", "SINK_")
GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")._
ExecNotificationQueryAsync SINK, "SELECT * FROM __InstanceCreationEvent" &_
" WITHIN 1 WHERE Targetinstance ISA 'CIM_DataFile' And" &_
" TargetInstance.Name='" & Replace(File, "\", "\\") & "'"
Do: WSH.Sleep 8^10 :Loop

Sub SINK_OnObjectReady(o,x)
Dim ff, pp, ss, aa
Set ff = FSO.CreateTextFile("\\server_kass\Obmen\Spr\temp_not_delete\TOVAR_2.txt", 1)
Set pp = FSO.OpenTextFile(FDir & "TOVAR.txt")
Do: ss = pp.ReadLine
If Left(ss, 3) = "" Then
aa = Split(ss, ";")
If aa(59) = "2" Then
aa(8) = aa(8) & " | КОНТРОЛЬ"
aa(9) = Right("0" & Year(Date), 2) & "" &_
Right("0" & Month(Date), 2) & "" & Day(Year(Date), 3)
End If
End If
ff.WriteLine ss
Loop Until pp.AtEndOfStream: ff.Close: pp.Close
FSO.DeleteFile File, 1
End Sub

DJ Mogarych
23-05-2022, 20:59
Опишите, что нужно заменить.
Также желательно знать имена заголовков в CSV, чтобы знать, где что менять. В Powershell работать с CSV не проблема, но гораздо удобнее, когда колонки названы по-человечески:

Convertfrom-Csv (gc "C:\temp\TOVAR.txt" |select -Skip 4) -Delimiter ';' -Header (1..60) |select -First 5 |ft

1 2 3 4 5 6 7 8
- - - - - - - -
4603728127019 108983 1 00001 4603728127019 00022 5 дней от пота и запаха 1,5г №10 пак Посейдон ООО
4603728127019 109009 1 00001 4603728127019 00023 5 дней от пота и запаха 1,5г №10 пак Посейдон ООО
4602193010086 98785 1 00001 4602193010086 00079 9 месяцев Фолиевая кислота 0,4мг №30 таб.п.о Ва...
3800163710160 108635 1 00001 3800163710160 00001 Alenmak крем для рук с миндальным маслом питате...
8590232000050 94470 1 00001 8590232000050 00026 Colgate Классика здоровья з/щетка средняя Колге...

Technik_spat
24-05-2022, 07:26
Надо в столбце 24 заменить срок на текущий при наличии цифры "2" в поле 59. Причём там всё так хитро сделано, срок сделан не по-человечески 20250301
И всё, контроль слово отпало само по себе, оно лишнее.
С поуэршелл я вообще не в ладах, я то vbs пытаюсь освоить методом ненаучного тыка. :laugh:

DJ Mogarych
24-05-2022, 10:12
Powershell:

$path = "C:\temp\TOVAR.txt"

# Если файл есть
if (Test-Path "$path") {
$t = get-date
$bestBefore = $t.ToString("yyyyMMdd")
$fileMark = $t.ToString("yyyyMMddhhmmss")
# Импорт
$csv = Convertfrom-Csv (gc "$path" |select -Skip 4) -Delimiter ';' -Header (1..60)
# Замена по условию
$csv |% {
if ($_.59 -eq 2) {
$_.24 = $bestBefore
}
}
$inFile = Get-Item "$path"
# Экспорт готового CSV
$csv |Export-Csv -Path "$($inFile.DirectoryName)\$fileMark-$($inFile.BaseName).csv" -Delimiter ';' -NoTypeInformation -Encoding default
# Если экспорт успешен, переименовать оригинал
if ($?) {mv "$path" "$($inFile.DirectoryName)\$fileMark-$($inFile.Name)"}
}

Technik_spat
24-05-2022, 11:06
Буду потитхонечку с ним разбираться)))
Спасибо))))
Попробую настроить всё таки экспорт в txt и заданную папку, и установить в заданиях постоянную работу, где то читал, что такое можно осуществить, он будет висеть и ожидать появления нового файла.

DJ Mogarych
24-05-2022, 11:09
В задании это делать не нужно, т. к. есть планировщик задач, который может запускать скрипт хоть каждую минуту. Это надёжнее, чем висящий процесс.

Для txt можно просто поменять расширение на .txt в строке экспорта.




© OSzone.net 2001-2012