drobne skrypty do automatyzacji z TC

Moderated forum for Polish users

Moderators: Gral, eltome, Usher

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

drobne skrypty do automatyzacji z TC

Post by *eltome »

Z TC jest możliwość zaprogramować cokolwiek niezłożonego i uruchomić z paska przycisków lub skonfigurować skrót-klawiaturowy. Można zautomatyzować jednym kliknięciem, przykładowo dodanie lub wykluczenie rozszerzenia pliku do wykrywania przez wtyczki, w tym wiele innych funkcjonalności (jak przestawień dowolnej wtyczki).
W między czasie mogą pojawić się różne*

Code: Select all

# PowerShell script adding or remove file extension for the plugin
<#
Argumenty uruchomienia oddzielone spacją:
 argument 1 to ścieżka do pliku konfiguracyjnego TC np. "C:\path\totalcmd.ini"
 argument 2 to nazwa wtyczki wg pliku .ini (zapis w "")
 argument 3 to rozszerzenie pliku do wykrywania przez określoną wtyczkę (może być w '')
 argument 4 opcjonalny - 1 oznacza dodanie rozszerzenia, a bez podania wartości to wykluczenie rozszerzenia
#>

# Przypisanie nazwy pliku do zmiennej plik1
$plik1 = $args[0]

# Przypisanie wartości parametru 2 do zmiennej plug
$plug = $args[1]

# Przypisanie wartości parametru 3 do zmiennej extP
$extP = $args[2]

# Sprawdzenie czy parametr 4 został podany i przypisanie wartości do zmiennej klucz1
if ($args[3]) {
    $klucz1 = $args[3]
} else {
    $klucz1 = 0
}

Try {
    # Sprawdzenie czy plik istnieje
    $fileExists = Test-Path $plik1
    if (-not $fileExists) {
        throw "Błędne dane: Plik $plik1 nie istnieje."
    }

    # Tworzenie kopii zapasowej pliku
    $backupFile = $plik1 + ".cop"
    Copy-Item $plik1 $backupFile

    # Otwarcie pliku do odczytu
    $fileContent = Get-Content $plik1

    # Szukanie tekstu ze zmiennej plug i zapamiętanie pierwszego znaku w linii
    $znalezionaLinia = $false
    foreach ($line in $fileContent) {
        if ($line.Contains($plug)) {
            $znak1 = $line.Substring(0, 1)
            $znalezionaLinia = $true
            break
        }
    }
    if (-not $znalezionaLinia) {
        throw "Nie znaleziono tekstu $plug w pliku $plik1."
    }

    # Tworzenie nowej zmiennej start1 ze znak1 & detectP
    $start1 = $znak1 + "_detect="

    # Kontynuowanie szukania w pliku tekstu ze zmiennej start1 i zapamiętanie numeru linii
    $znalezionaLinia2 = $false
    $numerLinii = 0
    foreach ($line in $fileContent) {
        $numerLinii++
        if ($line.Contains($start1)) {
            $znalezionaLinia2 = $true
            break
        }
    }
    if (-not $znalezionaLinia2) {
        throw "Nie znaleziono tekstu $start1 w pliku $plik1."
    }

    # Wyświetlenie prośby o potwierdzenie i naciśnięcie Enter
    Write-Host "Prośba potwierdzenia kontynuowania - nacisnąć Enter."
    $confirmation = Read-Host

    # Zastąpienie ostatniego znaku w zapamiętanej linii tekstem ze zmiennej extP
    if ($confirmation -eq "" -and $klucz1 -eq 1) {
        $lineToReplace = $fileContent[$numerLinii - 1]
        $lineToReplace = $lineToReplace.Substring(0, $lineToReplace.Length - 1) + $extP
        $fileContent[$numerLinii - 1] = $lineToReplace
    }

    # Zastąpienie szukanego tekstu w zapamiętanej linii stałą tekstową ( albo np. const4='"' )
    if ($confirmation -eq "" -and $klucz1 -eq 0) {
        $lineToReplace = $fileContent[$numerLinii - 1]
        $lineToReplace = $lineToReplace.Replace($extP, '"')
        $fileContent[$numerLinii - 1] = $lineToReplace
    }

    # Zapisanie zmienionego pliku lub i przekodowanie
    $fileContent | Set-Content $plik1 #-Encoding Unicode

    Write-Host "Zakończono pomyślnie."
} catch {
    Write-Host "Błąd: $($_.Exception.Message)"
}

# usage: ./this.ps1 ini plugin EXT [arg4]
# example: powerShell .\auto-ext "totalcmd.ini" "=%COMMANDER_PATH%\PLUGINS\WDX\SignatureInfo\SignatureInfo.wdx" ' | "PS1""' 1
*W Windows™ zastąpiono terminalem tradycyjną konsole. PowerShell to domyślna powłoka. Może być mankamentem to, że zawiera tłumaczenie angielskie na np. francuski, a standardowo nie ma polskiego. Spora zaleta skryptu to potencjał generowania dość precyzyjnego kodu przez AI i to od algorytmu napisanego po polsku. Twórcy systemu opracowują badania nad sztuczną inteligencją nakładem miliardów $.
Do znalezienia są moduły lub aplikacja, która przetwarza plik .ps1 na wykonywalny plik .exe
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 63
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: drobne skrypty do automatyzacji z TC

Post by *eltome »

łatka do poprzedniego skryptu redukująca potwierdzenie Enterem
auto-ext.patch*

Code: Select all

70,73d69
<     # Wyświetlenie prośby o potwierdzenie i naciśnięcie Enter
<     Write-Host "Prośba potwierdzenia kontynuowania - nacisnąć Enter."
<     $confirmation = Read-Host
< 
75c71
<     if ($confirmation -eq "" -and $klucz1 -eq 1) {
---
>     if ($klucz1 -eq 1) {
82c78
<     if ($confirmation -eq "" -and $klucz1 -eq 0) {
---
>     if ($klucz1 -eq 0) {
* Aby wprowadzić poprawki z tzw. łatki , można użyć programu WinMerge i zrobi to automatycznie albo dokonać manualnie:
linie z liczbami tylko, do pominięcia
< znak mniejszości (wskazuje na zewnątrz bardziej) na początku to linia, która jest do usunięcia w skrypcie
> znak większości (wskazuje do wewnątrz bardziej) na początku to linia, która jest do zastąpienia w miejsce usuniętej, przed ---
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 63
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: drobne skrypty do automatyzacji z TC

Post by *eltome »

Skrypt dodający do TC polecenie uruchomienia em_NAZWA jak z piliu np. usercmd.ini
user-cmd.ps1

Code: Select all

# .\skrypt.ps1 C:\sciezka\do\pliku.ini ".\name" text
$plikIni = $args[0]

if (-not (Test-Path $plikIni)) {
    $koment0 = "; Total Commander External"
    $koment0 | Out-File -FilePath $plikIni -Encoding utf8
}

$parametr2 = $args[1]
$skrypt2 = [System.IO.Path]::GetFileNameWithoutExtension($parametr2)
$parametr3 = $args[2]

$konst = "[em_"
$znak = "]"
$Linia = $konst + $skrypt2 + $znak
$Linia | Out-File -FilePath $plikIni -Append -Encoding utf8

$konst2 = "Cmd=powerShell "
$Linia2 = $konst2 + $parametr2
$Linia2 | Out-File -FilePath $plikIni -Append -Encoding utf8

<#
$konst4 = "Tooltip="
$Linia4 = $konst4 + $skrypt2
$Linia4 | Out-File -FilePath $plikIni -Append -Encoding utf8
#>

$konst3 = "Param="
$Linia3 = $konst3 + $parametr3
$Linia3 | Out-File -FilePath $plikIni -Append -Encoding utf8

Write-Host "Skrypt zakończony" -ForegroundColor blue
#388479
User avatar
eltome
Junior Member
Junior Member
Posts: 63
Joined: 2023-07-29, 15:54 UTC
Location: Warmian-Masurian Voivodeship

Re: drobne skrypty do automatyzacji z TC

Post by *eltome »

Skrypty które mogą wyczyścić pojedynczą Linie Poleceń etc z osobnego pliku historii w Total Commanderze :
czysci-klucz

Code: Select all

<#
np. .\clear-key -polecenie 'cm_List'
#>

#2 parametry uruchomienia default
param (
  [string]$plik = "CmdLHist.ini",
  [string]$polecenie =""
)

if ($polecenie -eq "") {Write-Host "wyjście - nie podano polecenia" -foregroundcolor 2;exit}

# Definicja funkcji Wczyt-Pliku
function Wczyt-Pliku {
    param (
        [Parameter(Mandatory=$true)] [string] $NazwaPliku
    )
    
    $Array = @()  # Inicjalizacja tablicy
    
    # Sprawdzenie czy plik istnieje
    if (!(Test-Path $NazwaPliku)) {
      Write-Host "Plik nie istnieje: $NazwaPliku"
     
      exit
    }
    
    # Wczytanie pliku tekstowego linia po linii
    try {
        $lines = Get-Content $NazwaPliku
        $Array = $lines
    }
    catch {
        Write-Host "Błąd podczas wczytywania pliku: $_"
    }
    
    return $Array
}

# subfunction
function ZnakPrzed($line1, $wartosc)
{
      if ($line1.Contains($wartosc)) 
      {
        # Pobranie indeksu pierwszego wystąpienia tekstu
        $index2 = $line1.IndexOf($wartosc)
        
        # Jeśli indeks jest większy od 0, zwraca znak znajdujący się przed tekstem
        if ($index2 -gt 0)
        {
            return $line1[$index2 - 1]
        }
      }
    
    # Jeśli tekst nie został znaleziony lub nie występuje poprzedzający znak, zwraca pusty ciąg
    return ""
}

function SprawdzZa($element, $wartosc) {
    # Pobierz indeks wystąpienia $wyraz w $element
    $index = $element.IndexOf($wartosc)

    # Jeśli $wyraz nie występuje w $element, zwróć "fałsz"
    if ($index -eq -1) {
        return $false
    }

    # Pobierz fragment $element po $wartosc
    $fragment = $element.Substring($index + $wartosc.Length)

    # Usuń białe znaki z $fragment
    $fragment = $fragment.Trim()

    # Jeśli $fragment jest pusty, zwróć "prawda", w przeciwnym razie zwróć "fałsz"
    if ($fragment -eq "") {
        return $true
    } else {
        return $false
    }
}


# Definicja podfunkcji Szukanie-Polecenia
function Szukanie-Polecenia {
    param (
        [Parameter(Mandatory=$true)] [string] $polecenie,
        [Parameter(Mandatory=$true)] [array] $Array
    )
    
    #$wers = 0  # Inicjalizacja zmiennej $wers
    $znaleziono=$false
    
    foreach ($line in $Array) {
        # Szukanie ciągu tekstowego w elementach tablicy
        if ($line -like "*$polecenie*") {
            $index = $Array.IndexOf($line)
            
            # Jeśli występuje przed znalezionym ciągiem tekstowym
            if ((ZnakPrzed $line $polecenie) -eq "="){ $przed=$true}
            
            # Jeśli występuje po znalezionym ciągiem tekstowym  
            if ((SprawdzZa $line $polecenie) -eq $true) { $za=$true}
            # spełnione oba warunki
            if ($przed -eq $true -and $za -eq $true) {
           
                $znaleziono=$true
                $wers = $index
                
                break
            }
            
        }
       
    } 
    
    if ($znaleziono) {
        #Write-Host "Znaleziono '$polecenie' w historii poleceń."
    }
    else {
        Write-Host "Nie znaleziono '$polecenie' w historii poleceń. Kończenie skryptu."
        exit
    }
    
    return $wers
    
}

# jeśli pokecenie jest ostatnim
function Przetwarzanie-Sekcji {
    param (
        [int]$wers,
        [array]$array
    )
    #$ostatnim=$false
    $indexOstatniegoElementu = $array.Count - 1

    # sprawdzenie czy index ostatniego elementu = znaleziona linia
    if ($indexOstatniegoElementu -eq $wers) {
      
        #czysci ostatni element
        $array = $array[0..($indexOstatniegoElementu - 1)]
        
        $ostatnim=$true
    }

    return $array, $ostatnim
}

# przerabia bez kasowania =
function RemoveAfterFirstEqualsSign {
    param(
        [string]$element
    )

    $index1 = $element.IndexOf('=')
    if ($index1 -ne -1) {
        $element = $element.Substring(0, $index1 + 1)
    }

    return $element
}

# 
function Przetwarzanie-Elementu {
    param (
        [int]$wers,
        [ref]$Array,
        [ref]$ostatni_element
    )

    # Pobranie wartości z indeksu $wers w tablicy $Array
    $element = $Array.Value[$wers]
    #$element = $Array[$wers]
    # Usunięcie zawartości po pierwszym napotkanym znaku "="
    
    $element = RemoveAfterFirstEqualsSign $element
    $Array.Value[$wers] = $element
    #$Array[$wers] = $element
    
    # Usunięcie zawartości przed pierwszym napotkanym znakiem "=" i samym znakiem
    $ostatni_element.Value = $Array.Value[-1] -replace '.*=', ''

    # Dodanie zawartości ze zmiennej $ostatni_element do elementu o numerze indeksu $wers w tablicy $Array
    $Array.Value[$wers] += $ostatni_element.Value
}

function Clear-Last {
    param (
        [array]$array
    )

    $array = $array[0..($array.Length - 2)]
    return $array
}

# wyświetlenie tablicy i zapis

function Zapis-Sekcji {
    param (
        [Parameter(Mandatory=$true)]
        [Array]$array,
        
        [Parameter(Mandatory=$true)]
        [string]$filePath
    )
    
    #Write-Host "Dane :" 
    $array | ForEach-Object {
        Write-Host $_
    }
    
    $array | Out-File -FilePath $filePath #-Encoding utf8
    
    Write-Host "Dane zostały zapisane do pliku: $filePath"
}

# użycie funkcji

$Array = Wczyt-Pliku -NazwaPliku $plik

$wers = Szukanie-Polecenia -polecenie $polecenie -Array $Array

$ostatnim=$false

$array, $ostatnim= Przetwarzanie-Sekcji $wers $array

if ( $ostatnim -eq $false ) {

  $ostatni_element = ""

  # Wywołanie funkcji Przetwarzanie-Elementu dla indeksu 1
  Przetwarzanie-Elementu -wers $wers -Array ([ref]$Array) -ostatni_element ([ref]$ostatni_element)

  # wyświetlenie elementu znalezionego jako ostatniego
  #Write-Host $Array[$wers]

  $array = Clear-Last -array $array
}

#aktualizacja danych
Zapis-Sekcji -array $array -filePath $plik

Skrypt z parametrem %N zmienia atrybut pliku w panelu TC :
zmiana-atrybutu

Code: Select all

# np. .\at-r plik r
<#
parametr 1 to ścieżka do pliku (np. CmdLHist.ini) , który chcesz sprawdzić i zmienić atrybut
parametry 2 to wartość r (wielkość litery bez znaczenia) dla zmiany atrybutu pliku na tylko odczyt 
            lub nie podany parametr w przypadku ustawienia atrybutu pliku nie tylko z odczytem
#>
param(
    [Parameter(Position=0)]
    [string]$sciezkaDoPliku="",
    
    [Parameter(Position=1)]
    [string]$Parametr=""
)

# Sprawdzenie istnienia pliku
if ($sciezkaDoPliku -ne "" -and (Test-Path -Path $sciezkaDoPliku -PathType Leaf)){
  # ...
}
else {
    "nie podano właściwej ścieżki do pliku" ; exit
}

# Sprawdzanie atrybutu pliku
$atrybuty = (Get-Item $sciezkaDoPliku).Attributes
$jestTylkoOdczyt = $atrybuty -band [System.IO.FileAttributes]::ReadOnly

# wykonanie w zależności od parametru
if ($parametr -eq "r") {
    Write-Host "Wykonywanie operacji dla parametru 'r'..."
    # kod operacji dla parametru 'r'
    # Sprawdzenie, czy plik ma ustawiony atrybut tylko do odczytu
    if ($atrybuty -band [System.IO.FileAttributes]::ReadOnly) {
      Write-Host "Plik ma już ustawiony atrybut tylko do odczytu."
    }
    else {
      # Zmiana atrybutu pliku na tylko do odczytu
      Set-ItemProperty -Path $sciezkaDoPliku -Name IsReadOnly -Value $true
      Write-Host "Zmieniono atrybut pliku na tylko do odczytu."
    }
} elseif ($parametr -eq "") {
    Write-Host "Wykonywanie operacji dla pustego parametru..."
    # kod operacji dla pustego parametru
    #Jeśli plik ma ustawiony atrybut tylko do odczytu, zmienia atrybut na do zapisu
    if ($jestTylkoOdczyt) {
    
      $plik = Get-Item -Path $sciezkaDoPliku
      $plik.IsReadOnly = $false
    
      Write-Host "Atrybut pliku został zmieniony na do zapisu."
    } else {
      Write-Host "Atrybut pliku nie jest ustawiony tylko do odczytu."
    } 
} else {
    Write-Host "Błędny parametr 2! Możliwe wartości to 'r' lub '' (pusty)."
    # Tutaj można umieścić kod w przypadku podania nieprawidłowego parametru
    exit
}

Skrypt restartujący TC. W przypadku m.in. UFM, ścieżka jest do skrótu .lnk pliku .exe :
restart-tc

Code: Select all

# .\restart-tc
# Sprawdzenie, czy Total Commander jest uruchomiony
$process = Get-Process -Name TOTALCMD64 -ErrorAction SilentlyContinue

if ($process) {
    # Zamykanie aplikacji T.C
    $process.CloseMainWindow()
    $process.WaitForExit()
}

# Ponowne uruchomienie programu TOTALCMD
Start-Process -FilePath <#...\#>TOTALCMD64.EXE

Można połączyć skrypty i dodać do przycisku wykonania jako zminimalizowane lub mogą być uruchamiane z dodatkowego np. :

Code: Select all

	#wyczyszczenie z historii poleceń 1 linii  -  wg podanego parametru
$polecenie = $args[0]; powerShell -WindowStyle Hidden czysci-klucz.ps1 historiaCmdLine.ini $polecenie

	#zmiana arybutu pliku na tylko do odczytu
PowerShell -WindowStyle Hidden -File "zmiana-atr.ps1" historiaCmdLine.ini r

	#restart TC 
powerShell -WindowStyle Hidden ŚCIEŻKA\restart-TC.ps1

	#przywrócenie atrybutu nie tylko do odczytu
$skrypt = "powerShell -WindowStyle Hidden zmiana-atr.ps1 historiaCmdLine.ini"
 # Wywołanie skryptu i wyjście
Invoke-Expression -Command $skrypt ;exit
#388479
Post Reply