TC jako Terminarz

Moderated forum for Polish users

Moderators: eltome, Usher, Gral

Post Reply
User avatar
eltome
Junior Member
Junior Member
Posts: 68
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

TC jako Terminarz

Post by *eltome »

intro

Terminarz w zamyśle trochę podobny do gadżetu 'Calendar' (PHSM) , Total Organizer w panelu, a bardziej 2stronowy, zdygitalizowany "filofax" - URL obrazu. Terminarz nie ma zastępować istniejących już dodatków tylko uzupełniać, nie wykluczone by ewoluować do typowej wtyczki, biblioteki niemodularnej - oddzielnej.
Założenia

Terminarz to koncepcja wsparcia zarządzania użytkownika Total Commandera. Umożliwi zaplanować jakieś zadanie, edytować liste zadań z usuwaniem, zapisać notatki używając symboli emoji (🪟+.), importować dane, ustawić tryb przeglądania, konfigurować języki interfejsu (tylko i osobno).
Nie zawiera instalatora, wystarczy najpierw umiejscowić w tej samej lokalizacji co \totalcmd\ , obok nowy folder skąd mogą być wczytywane polecenia, jak zakładki paneli dla odpowiedniego przedziału kalendarzowego , podkatalogi.
W Terminarzu wymieniane są poszczególne elementy:
  1. katalog \Terminarz\ , tworzony raz do wszelkich szablonów
  2. specjalny subpas przycisków terminarz.bar , dołączany do istniejących (obejmuje przełączniki zakładek etc.)
  3. zakładki w terminarz.tab , wstawiane jednym kliknięciem
  4. skrypt terminarz.wsf , docelowo służący konstruowaniu funkcjonalnych skryptów (m.in. jScript. , z rozszerzeniem.wsf - vbs zostanie niebawem wycofany przez Microsoft jako standard), deaktywujący nieprzydatne i przenoszące do kosza.

Mechanizm Terminarza oparty na systemowym 'Harmonogramie Zadań', który może samoczynnie włączać przygotowane zdarzenia o określonej dacie i czasie. Na przykład: wyświetlić przypomnienie z efektem dźwiękowym by zmienić atrybuty pliku lub nazwy, uruchomić program po sprawdzeniu jakiegoś warunku albo zakończyć inne działanie za potwierdzeniem.
Detale
Można zastosować całkowicie możliwości TC,
np. zrobić kolorem innym święta - z regWyr :

Code: Select all

.-\d+-Nd.htm
lub zakładki z ikonami , w zależności od nazwy (podfolderu) - 329 z: shell32.dll

Dodanie katalogu z linii poleceń :

Code: Select all

powerShell md %COMMANDER_PATH%\..\terminarz\
alternatywnie:

Code: Select all

cmd /k mkdir %COMMANDER_PATH%\..\terminarz\ & exit

Otwarcie zaznaczonego pliku paska przycisków:

Code: Select all

OPENBAR %P%N
Być może wykonanie pierwszego przycisku w katalogu Terminarza najlepiej uprościć z Power Automate i json (tzw. definiowany przepływ zdarzeń).
Pasująca ikona przycisku:

https://icon-icons.com/icon/read-open-book/187103
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 68
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: TC jako Terminarz

Post by *eltome »

Terminarz № 1 (oznaczenie) o treści z wyprzedzeniem jednego roku, chociaż nie jest to limit (początkowe ograniczenie zasobów, rozwijane ).

Ad. A - Odnośnie rozpoczęcia, sposobem dowolnym uwzględnionym w założeniach ;
przycisk 1 - wczytujący pasek przycisków

Code: Select all

TOTALCMD#BAR#DATA
OPENBAR %COMMANDER_PATH%\..\Terminarz\terminarz.bar

shell32.dll,329
Terminarz submenu


-1

Ad. B - Pasek przycisków wystarczy skopiować i wkleić kod:
terminarz.bar

Code: Select all

; Pasek przycisków Total Commander'a SubMenu (terminarz.bar)
; Język: Polish (Poland) [pl-PL]
; ID: 1045 (0x415)
; CodePage: UTF-8 *
; * znacznik kolejności bajtów
; tested :
; System : Ms Windows 11 (64-bit)
; Program: Total Commander (64-b.)

[Buttonbar]
Buttoncount=6
;pasek nadrzędny
button1=wcmicons.dll,15
cmd1=%COMMANDER_PATH%\default.bar
menu1=Domyślny pasek T C

;separator 
button2=

button3=wcmicons.dll,85
cmd3=SAVETABS2L
menu3=Zapis kopii zapasowej zakładek

menu4=załadowanie zakładki terminarza
button4=wcmicons.dll,83
cmd4=APPENDTABS %COMMANDER_PATH%\..\Terminarz\terminarz1.tab

;separator 
button5=

button6=wcmicons.dll,80
cmd6=wScript %COMMANDER_PATH%\..\Terminarz\terminarz.wsf
menu6=skrypt WSF

Ad. C - Zakładka podkatalogu roku - widoki paneli sprawdzane skryptem .
Np. w drugim panelu tydzień przyszły , w pierwszym panelu tydzień poprzedni - modyfikowane
terminarz.tab

Code: Select all

[activetabs]
;...
5_path= %COMMANDER_PATH%\..\terminarz\2024\
5_options=1|0|0|0|0|0|0|

activetab=5

;...  więcej wkrótce

Ad. D - JScript.

Opcjonalnie powielający dni pozostałe do końca roku - od aktualnej daty albo z parametrem .
terminarz.wsf

Code: Select all

<package id="Terminarz">
    <job id="Pliki-Dni">
        <script language="JScript">
            // Funkcja do dodawania zer z przodu, aby otrzymać liczby dwucyfrowe
            function zeroPad(number, length) {
                var str = '' + number;
                while (str.length < length) {
                    str = '0' + str;
                }
                return str;
            }

            // Funkcja do konwersji numerów (miesięcy) na liczby szesnastkowe
            function hexify(num) {
                return num.toString(16).toUpperCase();
            }

            // Funkcja do pobierania dwuliterowych skrótów dni tygodnia
            function getDaySuffix(day) {
                var daySuffixes = ["Nd", "Pn", "Wt", "Śr", "Cz", "Pt", "So"];
                return daySuffixes[day];
            }

            // Funkcja do tworzenia plików z nazwami w odpowiednim formacie od daty początkowej do końca roku
            function createFilesFromDate(startDate) {
                var endDate = new Date(startDate.getFullYear(), 11, 31);
                var currentDate = new Date(startDate);
                var lastFileCreated = false;
                var year = startDate.getFullYear();
                var fso = new ActiveXObject("Scripting.FileSystemObject");

                // Sprawdź, czy katalog o nazwie roku istnieje
                if (fso.FolderExists(year.toString())) {
                    WScript.Echo("Dane na wskazany rok zostały już wprowadzone.");
                    return;
                }

                // Utworzenie podkatalogu o nazwie roku
                fso.CreateFolder(year.toString());

                var firstFileCreated = false;

                while (currentDate <= endDate) {
                    var prefix = hexify(currentDate.getMonth() + 1);
                    var prefix2 = zeroPad(currentDate.getDate(), 2);
                    var suffix = getDaySuffix(currentDate.getDay());

                    var fileName = year + "\\" + prefix + '-' + prefix2 + '-' + suffix + '.htm';
                    var file = fso.CreateTextFile(fileName, true);

                    if (!firstFileCreated) {
                        file.WriteLine("<meta charset='UTF-8'>");
                        file.WriteLine("&#x1F558;<br><br><hr>&#x1F55B;<br><br><hr>&#x1F552;<br><br><hr>&#x1F555;<br><br><hr>");
                        firstFileCreated = true;
                    }

                    file.Close();

                    if (prefix === "C" && prefix2 === "31") {
                        lastFileCreated = true;
                    }

                    currentDate.setDate(currentDate.getDate() + 1);
                }

                if (!lastFileCreated) {
                    var lastDayDate = new Date(endDate);
                    lastDayDate.setDate(31);
                    var prefix = "C";
                    var prefix2 = "31";
                    var suffix = getDaySuffix(lastDayDate.getDay());
                    var fileName = year + "\\" + prefix + '-' + prefix2 + '-' + suffix + '.htm';

                    var file = fso.CreateTextFile(fileName, true);
                    file.Close();
                }
            }

            // Funkcja do parsowania daty z parametru
            function parseDate(dateString) {
                var parts = dateString.split("-");
                var year = parseInt(parts[0], 10);
                var month = parseInt(parts[1], 10) - 1; // Miesiące w JavaScript są indeksowane od 0
                var day = parseInt(parts[2], 10);
                return new Date(year, month, day);
            }

            // Pobieranie bieżącej daty z kalendarza systemowego Windows lub użycie daty z parametru: YYYY-MM-DD
            var today = new Date();
            if (WScript.Arguments.length > 0) {
                today = parseDate(WScript.Arguments(0));
            }
            createFilesFromDate(today);
            // Wyświetlanie komunikatu końcowego
            WScript.Echo("Pliki dni zostały utworzone w podkatalogu roku");
        </script>
    </job>
</package>
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 68
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: TC jako Terminarz

Post by *eltome »

Terminarz № 2

wprowadzane ulepszenia:
· kompletny pasek przycisków,
· podkatalog z szablonami skrótów na rok 2026, ładowanie układu zakładek
· skrypty integrujące np. Wpis terminu do terminów w Harmonogramie Zadań i odznaczający dzień w Terminarzu , parametry , ukrywane minione dni
wstępne skrypty - .wsf

Code: Select all

<job id="RunPowerShell">
    <script language="JScript">
        /* wywołanie ps  */ 
        var objShell = new ActiveXObject("WScript.Shell");
        //objShell.Run("powershell.exe -Command \"Write-Output 'komunikat!'\"", 1, true);
        objShell.Run("powershell.exe -File \"C:\\sciezka\\do\\script.ps1\"", 1, true);
    </script>
</job>
wpis do Task Scheduler - harmonograms.ps1

Code: Select all

#kodowanie UTF-8 z sygnaturą
<#
 skrypt tworzy folder z zadaniem w Harmonogramie
#>

# przykładowy parametr: 2024-12-20T21:56:00
param (
    [string]$TaskDateTime
)

# Sprawdzenie, czy podano parametr i czy jest w prawidłowym formacie
if (-not $TaskDateTime -or -not $TaskDateTime -match '^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$') {
    Write-Output "Nie podano parametru lub nieprawidłowy format. Użyj formatu: RRRR-MM-DDTHH:MM:SS"
    exit
}

# Sprawdzenie, czy istnieje podkatalog 'terminy'
$taskFolder = "\terminy"
$taskService = New-Object -ComObject Schedule.Service
$taskService.Connect()
$rootFolder = $taskService.GetFolder("\")
$folderExists = $false

foreach ($folder in $rootFolder.GetFolders(0)) {
    if ($folder.Path -eq $taskFolder) {
        $folderExists = $true
        break
    }
}

# Utworzenie podkatalogu 'terminy', jeśli nie istnieje
if (-not $folderExists) {
    $rootFolder.CreateFolder($taskFolder)
}

# Sprawdzenie, czy istnieje zadanie o nazwie 'termin'
$taskName = "termin"
$taskExists = $false
$taskFolderObj = $taskService.GetFolder($taskFolder)

foreach ($task in $taskFolderObj.GetTasks(0)) {
    if ($task.Name -eq $taskName) {
        $taskExists = $true
        break
    }
}

# Jeśli zadanie istnieje, wyświetlenie komunikatu i zakończenie skryptu
if ($taskExists) {
    Write-Output "Zadanie o tej nazwie już istnieje."
    exit
}

# Utworzenie zadania, jeśli nie istnieje
$taskDefinition = $taskService.NewTask(0)
$taskDefinition.RegistrationInfo.Description = "Zadanie uruchamiające efekt dźwiękowy i skrypt.wsf"
#nazwa użytkownika:
#$taskDefinition.Principal.UserId = "..."
$taskDefinition.Principal.LogonType = 3
$taskDefinition.Settings.Enabled = $true
$taskDefinition.Settings.AllowDemandStart = $true

# Ustawienie wyzwalacza na określoną datę i czas
$trigger = $taskDefinition.Triggers.Create(1)
$trigger.StartBoundary = $TaskDateTime
$trigger.Enabled = $true

# Dodanie akcji uruchamiającej efekt dźwiękowy - m.in. chimes.wav
$action1 = $taskDefinition.Actions.Create(0)
$action1.Path = "powershell.exe"
$action1.Arguments = "-c (New-Object Media.SoundPlayer '%WinDir%\Media\Alarm01.wav').PlaySync()"

# Dodanie akcji uruchamiającej skrypt.wsf ze ścieżki
$action2 = $taskDefinition.Actions.Create(0)
$action2.Path = "wscript.exe"
$action2.Arguments = "c:\paths\Terminarz\komunikat.wsf"

# Zarejestrowanie zadania
$taskFolderObj.RegisterTaskDefinition($taskName, $taskDefinition, 6, $null, $null, 3)

Write-Output "Zadanie zostało utworzone."
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 68
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: TC jako Terminarz

Post by *eltome »

(1 post zarezerwowany)
#388479
Post Reply