Запуск процедуры обмена данными через скрипт в PowerShell (как пример работы из PowerShell с 1С через COM)

В этом скрипте используется работа из PowerShell с 1С через COM, в начале скрипта делается скрытие черного окошка, чтоб оно не висело на экране пока выполняется скрипт.

Полезного тут наверно только метод скрытия окошка скрипта, это весь текст до «$connector = new-object -comobject «V81.COMConnector»», а все что после — это работа с 1С через COM — думаю уже не раз обсуждалось.

Может кому, что и пригодится, скрипт можно вставлять в планировщик например, или кинуть ярлык пользователю, чтоб одним щелчком запускалась заложенная процедура. Удачи всем!

P.S. Текст скрипта для гостей:

#Создаём объект CodeProvider, для выполнения кода c# в нашем сценарии
$cp = new-object Microsoft.CSharp.CSharpCodeProvider
#В этой переменной можно задать параметры для выполнения кода
$cpar = New-Object System.CodeDom.Compiler.CompilerParameters
#Константы задающие действие функции SetWindowPos
$HideWindow = 0x0080
$ShowWindow = 0x0040

#С помощью конструкции "HereString" помещаем в переменную $Code код c#
#объявляющий функцию SetWindowPos
$Code = @"
using System;
using System.Runtime.InteropServices;
namespace Win32API
{
public class Window
{
[DllImport("user32.dll")]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
}
}
"@

#Выполняем код c#
$cp.CompileAssemblyFromSource($cpar, $code)

#Получаем указатель (Handle) текущего окна PowerShell, используя специальную переменную $pid
$PSHandle = (Get-Process –id $pid).MainWindowHandle

#Используем объявленную функцию из PowerShell
[Win32API.Window]::SetWindowPos($PSHandle, 0, 0, 0, 0, 0, $HideWindow)

$connector = new-object -comobject "V81.COMConnector"
$connection=$connector.connect("File=""d:Bases1CПапка с ИБ""; Usr=""Логин"";Pwd = ""Пароль"";")
$ChangeName="Имя обмена в справочнике"

$cats = [System.__ComObject].InvokeMember("Справочники",[System.Reflection.BindingFlags]::GetProperty,$null,$connection,$null)
$nod = [System.__ComObject].InvokeMember("НастройкиОбменаДанными",[System.Reflection.BindingFlags]::GetProperty,$null,$cats,$null)
$fnd = [System.__ComObject].InvokeMember("НайтиПоНаименованию",[System.Reflection.BindingFlags]::InvokeMethod,$null,$nod,$ChangeName)
$ref = [System.__ComObject].InvokeMember("Ссылка",[System.Reflection.BindingFlags]::GetProperty,$null,$fnd,$null)
$pod=  [System.__ComObject].InvokeMember("ПроцедурыОбменаДанными",[System.Reflection.BindingFlags]::GetProperty,$null,$connection,$null)
$vodppn=[System.__ComObject].InvokeMember("ВыполнитьОбменДаннымиПоПроизвольнойНастройке",[System.Reflection.BindingFlags]::InvokeMethod,$null,$pod,$ref)  

10 Comments

  1. dka80

    Может быть выложишь прям сюда текст скрипта поглядеть?

    Reply
  2. Angeros

    Да. это былобы очень любопытно

    Reply
  3. Angeros

    Да. это было-бы очень любопытно

    Reply
  4. JohnySC

    Модераторы вроде не против, добавил в текст скрипт

    Reply
  5. echo77

    может, на vbs/js проще пример подать?

    Reply
  6. cool.vlad4

    (5) это зависит от ОС и от пишущего

    Reply
  7. JohnySC

    l(5) echo77, (6) cool.vlad4, да-да, конечно. Не помню почему я на PS тогда писал, видимо были причины, давно уже это было, работает в данный момент уже больше года или даже двух на Windows 2003 Server, запускает планировщиком обмен каждые 20 минут по трем узлам обмена. На VBS вроде довольно много попадалось разных скриптов в сети, тут уж опубликовал тот пример, который у меня был 🙂

    Reply
  8. java

    спасибо, инетресный механизм. добавлю в избранное )

    Reply
  9. jko

    Посмотрим.

    Кучу всего нарыл, может и это попробую 🙂

    Reply
  10. avz_1C

    Автор, спасибо, поставил Вам «+».

    Отдельное спасибо за избавление от «чёрного окошка».

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *