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

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

Technik_spat 23-05-2022 09:41 2985534

Скрипт vbs не могу настроить
 
Вложений: 1
Форумчане, здравствуйте!
Подскажите, пожалуйста, что делаю не так.
Сама задача: при появлении нового файла (в данном случае 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 2985560

Опишите, что нужно заменить.
Также желательно знать имена заголовков в 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 2985581

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

DJ Mogarych 24-05-2022 10:12 2985589

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 2985595

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

DJ Mogarych 24-05-2022 11:09 2985596

В задании это делать не нужно, т. к. есть планировщик задач, который может запускать скрипт хоть каждую минуту. Это надёжнее, чем висящий процесс.

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


Время: 23:27.

Время: 23:27.
© OSzone.net 2001-