ИзмСнСниС настроСк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с сохранСниСм ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ

Π’ ΠΎΠ΄Π½ΠΎΠΉ мСдицинской ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ внСдряли Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Π±Π°Π·Π΅ PACS-сСрвСров Orthanc ΠΈ DICOM-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Radiant. Π’ Ρ…ΠΎΠ΄Π΅ настройки выяснили, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ DICOM-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ описан Π² PACS-сСрвСрах ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • Имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
  • AE-имя (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ)
  • TCP-ΠΏΠΎΡ€Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски открываСтся Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ DICOM-обслСдования ΠΎΡ‚ PACS-сСрвСра (Ρ‚.Π΅. сСрвСр ΠΊΠ°ΠΊ Π±Ρ‹ Ρ‚ΠΎΠ»ΠΊΠ°Π΅Ρ‚ ΠΈΡ… Π² сторону ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° – инициируя соСдинСниС ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ)
  • IP-адрСс

ПослС настройки Radiant ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΊ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡŽ – Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° настройка ПО с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ заполнСнию Ρ„Π°ΠΉΠ»Π° pacs.xml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ располагался Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (ΠΏΡƒΡ‚ΡŒ: %APPDATA%RadiantViewerpacs.xml). ΠŸΡ€ΠΈ этом ΠΊΠΎΠ½Ρ„ΠΈΠ³ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ отличался ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ двумя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (AE-имя Ρƒ всСх Ρ€Π°Π·Π½ΠΎΠ΅, Π° ΠΏΠΎΡ€Ρ‚ Π² основном ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ сСрвСрС – Ρ‚Π°ΠΌ ΠΏΠΎΡ€Ρ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° pacs.xml ΠΏΠΎ ссылкС:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎΠ»Π³ΠΎΠ΄Π° всС Π±Ρ‹Π»ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, систСма заработала…и Ρ‚ΡƒΡ‚ Π΄ΠΎ нас дошли Β«ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈΒ»:

  • Нам Π½ΡƒΠΆΠ½ΠΎ ввСсти Π² строй нСсколько Π½ΠΎΠ²Ρ‹Ρ… PACS-сСрвСров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подмСнят старыС (Π³Π΄Π΅ стало Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ мСсто Π½Π° дисках). PACS сСрвСра Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…, Π½ΠΎ Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΎΠ± этом;
  • Нам Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (двумя ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ) Π½Π° 200 ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… (ΠΈΡ… количСство рСгулярно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ);
  • Учитывая Ρ‚Π΅ΠΌΠΏΡ‹ роста объСмов обслСдований, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Ρ€Π°Π·ΠΎΠ²ΠΎΠ΅, Π° Ρ‚ΠΈΡ€Π°ΠΆΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ ΠΈ рСгулярноС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1 Ρ€Π°Π· Π² 3-5 мСсяцСв).

РСшСниС ниТС.

Π’Ρ‹Π±ΠΎΡ€ инструмСнтария для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ

Π’Π½Π°Ρ‡Π°Π»Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° измСняло Ρ„Π°ΠΉΠ» pacs.xml, ΠΈ вносило Π² Π½Π΅Π³ΠΎ измСнСния Π² список PACS-сСрвСров, Π½Π΅ трогая настройки AE-ΠΈΠΌΠ΅Π½ΠΈ ΠΈ TCP-ΠΏΠΎΡ€Ρ‚Π°. Windows ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π±Ρ‹Π»ΠΈ Π½Π° Π±Π°Π·Π΅ ΠΊΠ°ΠΊ Windows XP, Ρ‚Π°ΠΊ ΠΈ Windows 7 – поэтому Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π½Π° Π±Π°Π·Π΅ VBScript. Но ΡƒΠ²Ρ‹ – ΠΎΡΠΈΠ»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Π²Π²ΠΈΠ΄Ρƒ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ отсутствия ΠΎΠΏΡ‹Ρ‚Π° написания Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ слоТного ΠΈ комплСксного Π½Π° этом языкС. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΆΠ΅ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΡƒΠ²Π΅Π½Ρ‡Π°Π»ΠΈΡΡŒ успСхом (Ρ‚ΡƒΡ‚ Π½Π°Π΄ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π» Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ»Π°Π½, поэтому я Π½Π΅ долбился с VBScript большС 3-4 часов).

Π’ ΠΈΡ‚ΠΎΠ³Π΅ я остановился Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ:

  • Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ всС Ρ„Π°ΠΉΠ»Ρ‹ pacs.xml Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС Π½Π° ΠΊΠ°ΠΊΠΎΠΌ Π½ΠΈ Π±ΡƒΠ΄ΡŒ сСрвСрС Π² сСтСвом рСсурсС;
  • Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ скопом (ΠΎΠΏΡ‹Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ ΡƒΠΆΠ΅ Π±Ρ‹Π» – с использованиСм Perl);
  • Π’Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ настройки ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

Π‘Π±ΠΎΡ€ Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

Бамая простая Ρ‡Π°ΡΡ‚ΡŒ – ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π² свой ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΎΠ½ со своими ΠΏΡ€Π°Π²Π°ΠΌΠΈ выполняСт Π½Π΅ΠΊΠΈΠΉ .bat Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прописано:

echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° сСрвСрС Π² скрытом рСсурсС Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ»Ρ‹ pacs.xml, Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ информация с ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΈ с ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±Ρ‹Π» скопирован Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³.

Π‘Π°ΠΌΠΎΠ΅ слоТноС Π±Ρ‹Π»ΠΎ – Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° Ρƒ всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ данная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°.

ИзмСнСниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Perl скрипта

Нам потрСбуСтся Active Perl ΠΏΠΎΠ΄ Windows ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ActiveState, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ XML::Writer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ppm install XML-Writer.

Π‘Π°ΠΌ ΠΆΠ΅ скрипт получился довольно простой:

use XML::Writer;
 
# ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ°ΠΏΠΊΡƒ с ΠΎΡ‚Ρ‡Π΅Ρ‚Π°ΠΌΠΈ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ссписок (удаляСм лишнСС):
	$report_dir = "C:Perl64WORKPACS-xml3";
	opendir(DIR, "$report_dir") or die "НС ΠΌΠΎΠ³Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ с ΠΎΡ‚Ρ‡Π΅Ρ‚Π°ΠΌΠΈ!";
	@report_files = readdir DIR;
	shift (@report_files); # удаляСм Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈΠ· элСмСнтов массива (.)
	shift (@report_files); # удаляСм Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΠ· элСмСнтов массива (..)
#	print "@report_files";
	closedir(DIR);
 
# НачинаСм ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ - ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π·Π° Ρ€Π°Π·. НуТно ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ AET ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.
foreach $analiz_file (@report_files) 
{
	$full_path_to_file="C:Perl64WORKPACS-xml3".$analiz_file;
	open (INFO, $full_path_to_file);
 
	while ($line = <INFO>)
	{
		# ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ $aet ΠΈ $port содСрТат ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ XML Ρ„Π°ΠΉΠ»Π°:
		my ($other1, $aet, $other2, $port, $other3) = split /"/, $line, 5;
		# Если встрСчаСтся строка listener - Ρ‚ΠΎ ΠΌΡ‹ дошли Π΄ΠΎ Π½ΡƒΠΆΠ½ΠΎΠΉ строчки ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ XML:
		if ($other1 =~ 'listener')
			{
				# Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ XML c Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ полями ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:
				my $writer = XML::Writer->new(OUTPUT => 'self', DATA_MODE => 1, DATA_INDENT => 2, );
				$writer->xmlDecl('utf-8');
				$writer->startTag('pacs');
				$writer->startTag('listener', ae => $aet, port => $port);
				$writer->endTag();
				$writer->startTag('hosts');
				$writer->startTag('host', name => 'MRT', ae => 'ORTHANC', ip => 'XX.YY.214.17', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT', ae => 'ORTHANC2', ip => 'XX.YY.215.253', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'R', ae => 'ORTHANC3', ip => 'XX.YY.215.252', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT-20180501-20180831', ae => 'ORTHANC4', ip => 'XX.YY.215.251', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->startTag('host', name => 'KT-20180901-20181130', ae => 'ORTHANC5', ip => 'XX.YY.215.250', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0');
				$writer->endTag();
				$writer->endTag('hosts');
				$writer->startTag('presets');
				$writer->endTag();
				$writer->startTag('lastsearch', dt => '4', mfid => '1048592');
				$writer->endTag();
				$writer->endTag('pacs');
 
				# ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ XML Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:
				my $xml = $writer->end();
				# ΠŸΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» для пСрСзаписи:
				$rewritexml = $full_path_to_file;
				# ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ XML Ρ„Π°ΠΉΠ»Ρ‹ Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:
				open (NEWXML, ">$rewritexml");
				print NEWXML $xml;
				close (NEWXML);				
			}
	}
 
}

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹:

  • ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ нас собраны ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ pacs.xml ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ список Ρ„Π°ΠΉΠ»ΠΎΠ² Π² массив скаляров (@report_files);
  • Π’ Ρ†ΠΈΠΊΠ»Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ ΠΈ считываСм Π΅Π³ΠΎ построчно;
  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ split Π΄Ρ€ΠΎΠ±ΠΈΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку Π½Π° 5 частСй, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ;
  • Находим строку с словом listener ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π΄Π°Π½Π½Ρ‹Π΅ (AE-имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ Π½ΠΎΠΌΠ΅Ρ€ TCP-ΠΏΠΎΡ€Ρ‚Π°);
  • ПослС этого просто Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ XML-Ρ„Π°ΠΉΠ», вписываСм Π² Π½Π΅Π³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ Π΄Π°Π»Π΅Π΅ вставляСм Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство PACS-сСрвСров с ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ – Ρ‚.Π΅. Ρ‚ΠΎ, Ρ€Π°Π΄ΠΈ Ρ‡Π΅Π³ΠΎ всС Π·Π°Ρ‚Π΅Π²Π°Π»ΠΎΡΡŒ)
  • ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ XML-Ρ„Π°ΠΉΠ» ΠΏΠΎΠ²Π΅Ρ€Ρ… старого.

Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π΄Π°Π½Π½Ρ‹ΠΉ скрипт Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ автоматичСски – ΠΏΠΎ сути я ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽ собираСмыС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ запуская скрипт измСняю ΠΈΡ… всСм скопом. Π”Π°Π»Π΅Π΅ выборочная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° – ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΠΎ машинам.

РаспространСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… pacs.xml Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ

Π‘Π°ΠΌΠΎΠ΅ простоС, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ – внСсти измСнСния Π² ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ .bat Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ собираСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строку:

If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ .bat Ρ„Π°ΠΉΠ» выглядит Ρ‚Π°ΠΊ:

@echo off
If exist %APPDATA%RadiantViewerpacs.xml copy %APPDATA%RadiantViewerpacs.xml srv.test.localpconfigs$pacs-%COMPUTERNAME%-%USERNAME%.xml
If exist %APPDATA%RadiantViewerpacs.xml copy /Y srv.test.localpconfigsnew$pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%RadiantViewerpacs.xml

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π°ΠΊΠΎΠ΅ Π²ΠΎΡ‚ Β«Π½Π°ΠΊΠΎΠ»Π΅Π½ΠΎΡ‡Π½ΠΎΠ΅Β» Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠžΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ ΡƒΠΆΠ΅ Π΄Π²Π° Ρ€Π°Π·Π° (Π² сСнтябрС 2018 ΠΈ Π² Ρ„Π΅Π²Ρ€Π°Π»Π΅ 2019), ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ обновляСт Π½Π΅ 100% ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ этому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ β€” ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅ΠΌ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ. Π‘ΠΊΡ€ΠΈΠΏΡ‚ ΠΏΠΎ ссылкС.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ