Script – die besten Beiträge

Was machen diese Powershellbefehle?

Ich habe follgendes Script mit folgenden Kommentaren:
# Nach dem Quellordner fragen

$sourceFolder = Read-Host "Quellordner"

# Nach dem Zielordner fragen

$targetFolder = Read-Host "Zielordner"

$SearchFile = 'ManualToHelpCmd.exe' # Datei welche gesucht werden soll

$ExcludeFolders = 'Windows','Video' # Hauptordner in Laufwerken, welche überhaupt nicht durchsucht werden sollen

# ermittle alle lokalen Laufwerke (HDD, SSD, USB, SD...) (keine CD, DVD)

$Drives = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType = 3 or DriveType = 2').DeviceID -as [Array] 

# Get-CimInstance:Instanzen einer bestimmten Klasse aus dem CIM (Common Information Model) abruft

# ClassName Win32_LogicalDisk: Gibt an, dass Informationen aus der Klasse Win32_LogicalDisk abgerufen werden sollen die Laufwerke auf dem System beschreibt

# Filter 'DriveType = 3 or DriveType = 2': Ein Filter der nur die logischen Laufwerke auswählt deren DriveType gleich 3 oder 2 ist. DriveType 3 steht für lokale Festplatten, und DriveType 2 steht für Wechseldatenträger (z.B. USB-Sticks).

# DeviceID: Greift auf die DeviceID-Eigenschaft der zurückgegebenen logischen Laufwerke zu, was die Laufwerksbuchstaben (z.B. C:, D:) darstellt

# -as [Array]: Konvertiert die Liste der DeviceIDs in ein Array

# Überprüfen, ob Laufwerke gefunden wurden

if (-not $Drives) {

  Write-Host "Keine Laufwerke gefunden." -ForegroundColor Red

  exit

}

# das eigentliche Arbeitspferd

$Worker = {

  param(

    [Array]$Drives,

    [String]$Filter,

    [Array]$ExcludeFolders

  )

# param(: Definiere die Parameter die der Skriptblock akzeptiert

# [Array]$Drives: Ein Array von Laufwerken

# [String]$Filter: Ein String-Filter

# [Array]$ExcludeFolders: Ein Array von auszuschließenden Ordnern

  $Results = @() #Initialisiert eine leere Array-Variable namens "Results" die verwendet wird um die Ergebnisse zu speichern.

  foreach ($Drive in $Drives) { #Jedes Element wird in der Variablen $Drive gespeichert.

    $Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName #-ErrorAction: Dieser Parameter steuert, wie das Cmdlet auf Fehler reagiert. SilentlyContinue: Diese Einstellung bewirkt, dass Fehler zwar erkannt, aber nicht angezeigt werden. Filtert hier sozusagen anch den Fehlern aber gibt sie nicht aus

    $Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName #-Directory = nur buchstaben, | = und, Recurse = sucht in 

   

     

  }

  return $Results

}

# die Suche starten...

if ($Drives.Length -lt 2) {

  # wenn wir nur ein (Physikalisches) Laufwerk haben können wir die Verteilung auf mehrere Jobs sparen, einfach den Worker direkt ausführen

  Write-Host "$($Drives.Length) physikalische Festplatte(n), Suche wird einstufig durchgeführt:" -ForegroundColor Magenta

  $Result = & $Worker -Drives $Drives -Filter $SearchFile -ExcludeFolders $ExcludeFolders

} else {

  # bei mehreren Laufwerken die Arbeit auf mehrere parallele Jobs verteilen

  $Jobs = $Drives | ForEach-Object {

    Write-Host "Festplatte $_ wird durchsucht" -ForegroundColor Green

    Start-Job -ScriptBlock $Worker -ArgumentList @($_ , $SearchFile, $ExcludeFolders)

  }

  $Result = $Jobs | Wait-Job | Receive-Job | Where-Object {$_}

}

# Debugging-Ausgabe für die gefundenen Ergebnisse

Write-Host "Gefundene Dateien:" -ForegroundColor Cyan

$Result | ForEach-Object { Write-Host $_ -ForegroundColor Cyan }

if ($Result) {

  # Wenn mehrere Dateien gefunden werden, Auswahl anzeigen

  if ($Result.Count -gt 1) {

    Write-Host "Es wurden mehrere Dateien gefunden mit gleichnamigen Namen. Wählen Sie die gewünschte Datei aus!" -ForegroundColor Yellow

    $selectedFile = $Result | Out-GridView -Title "Wählen Sie die Datei aus, welche Sie benutzen wollen!" -OutputMode Single

  } else {

    $selectedFile = $Result

  }

  # Das Ergebnis (können auch mehrere Dateien gleichen Namens sein)

  if ($selectedFile) {

    Write-Host "Ausgewählte Datei: $selectedFile" -ForegroundColor Green

    & $selectedFile $sourceFolder $targetFolder

  } else {

    Write-Host "Keine Datei ausgewählt" -ForegroundColor Red

  }

} else {

  Write-Host "Keine Datei gefunden" -ForegroundColor Red

}

Aber was machen diese zwei Zeilen?:
$Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName 

$Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName 

Script, PowerShell

Bashskript Problem?

Ich habe hier ein Bashskript, welches Dateien überwacht (noch nicht vollständig und absolut unoptimiert). Ich weiß, dass es Tools gibt, aber es ist ein Projekt für die Uni und deshalb ist Optimierung und Effizienz nicht wirklich wichtig. Ich möchte damit die Grundlagen des Shellscriptings einfach etwas lernen.

Das ist bisher das Script:

#!/bin/bash


echo "Das Skript wurde gestartet. Der Typ Ihres Betriebssystem ist "\"$OSTYPE\""."


# If-Abfrage, die das Betriebssystem erkennt und den Pfad zum überwachten Ordner oder Datei festlegt # HIER BITTE DIE PFADE ZUM ZU ÜBERWACHENDEN ORDNER EINTRAGEN   
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    BASE_DIRECTORY=" " # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Linux
elif [[ "$OSTYPE" == "darwin"* ]]; then
    BASE_DIRECTORY="/Users/name/Library/CloudStorage/GoogleDrive-email@gmail.com/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = MacOs
elif [[ "$OSTYPE" == "win32" || "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
    BASE_DIRECTORY="/g/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Windows
else    
    echo "Das Betriebssystem ist unbekannt." # Wenn das Betriebssystem unbekannt ist, wird eine Fehlermeldung ausgegeben
    exit 1
fi


DIRECTORY="$BASE_DIRECTORY" # Pfad zum Ordner
FILE="$BASE_DIRECTORY/Datei.txt" # Pfad zur Datei   
FILE2="$BASE_DIRECTORY/Datei2.txt" # Pfad zur Datei2 


cd "$BASE_DIRECTORY" || {
    echo "Wechsel zu $BASE_DIRECTORY fehlgeschlagen!" # Wechselt in den TestOrdner oder gibt eine Fehlermeldung aus
    exit 1;
}



# Funktion, um zu überprüfen, ob Dateien gelöscht wurden
checkIfDeleted() {
    if [ ! -f "$FILE" ]; then 
        echo "Die Datei \"$(basename "$FILE")\" wurde gelöscht, umbenannt oder verschoben."
    elif [ ! -f "$FILE2" ]; then
        echo "Die Datei \"$(basename "$FILE2")\" wurde gelöscht, umbenannt oder verschoben."
    elif [ ! -d "$DIRECTORY" ]; then
        echo "Der Ordner \"$(basename "$DIRECTORY")\" wurde gelöscht, umbenannt oder verschoben."
    fi
}


# Speichert den "ursprünglichen" Hash-Wert der Dateien
ORIGINAL_HASH=$(md5 -q "$FILE")
ORIGINAL_HASH2=$(md5 -q "$FILE2")


checkIfEdited() {
    if [ ! -f "$FILE" ]; then # Wenn $FILE nicht existiert, dann wird das Skript hier beendet
    return
    fi


    if [ ! -f "$FILE2" ]; then # Wenn $FILE2 nicht existiert, dann wird das Skript hier beendet
    return
    fi


    if [ ! -d "$DIRECTORY" ]; then # Wenn $DIRECTORY nicht existiert, dann wird das Skript hier beendet
    return
    fi


    # Berechnet den aktuellen Hash-Wert der Dateien
    CURRENT_HASH=$(md5 -q "$FILE")
    CURRENT_HASH2=$(md5 -q "$FILE2")


    # Hash-Werte werden verglichen
    if [ "$CURRENT_HASH" != "$ORIGINAL_HASH" ]; then
        echo "Die Datei \"$(basename "$FILE")\" wurde bearbeitet."
        # Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
        ORIGINAL_HASH="$CURRENT_HASH"
    elif [ "$CURRENT_HASH2" != "$ORIGINAL_HASH2" ]; then
        echo "Die Datei \"$(basename "$FILE2")\" wurde bearbeitet."
        # Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
        ORIGINAL_HASH2="$CURRENT_HASH2"
    fi
}


while true; do # Endlosschleife, die die Funktionen "checkIfDeleted" und "checkIfEdited" alle 10 Sekunden ausführt
    checkIfDeleted
    checkIfEdited
    sleep 10
done

Ja, ich weiß, welche Probleme das Skript mit sich bringt, aber ich habe ein anderes Problem:

Wenn jemand das Skript nutzen möchte, muss er die Pfade seiner Dateien einfügen und sogar neue Variablen definieren.

Man könnte das doch so machen, dass das Skript die Liste des Ordners einliest und dann auf alle Dateien direkt zugreifen muss, ohne dass man sie in das Skript einfügen muss.

Also irgendwie mit dem Befehl "ls". Ich weiß aber nicht, wie ich das implementieren soll.

Kann mir wer helfen bitte?

Visual Basic, Linux, HTML, Webseite, VBA, Bash, Batch, cmd, Code, lua, MySQL, PHP, Programmiersprache, Python, Script, Python 3

Python variable ändern (erhöhen oder verringern)?

Ich bin ein absoluter Anfänger was programmieren angeht, lerne aber immer mehr und mehr dazu. Ich möchte für etwas ein Python Script erstellen, was auf meinem Pi die ganze Zeit läuft und die MQTT Nachrichten mitliest, um diese auszuführen und/oder eine Nachricht zurück zu senden.

Ich habe versucht eine Nachricht zu senden der den wert der Variable um 1 erhöhen soll und damit auch die While schleife aktivieren soll. Jedoch funktioniert es nicht, da die variable nicht in "def on_message" verfügbar ist und es die Erhöhung quasi nicht nach außen austrägt.

Was gibt es für Möglichkeiten die variable zu erhöhen, sodass sich die while schleife aktiviert? Und gibt es auch andere Ansätze wie man eine diese Schleife machen kann?

Script:

import paho.mqtt.client as mqtt
import os
import subprocess
import time
import smbus2
import bme280

#Bme280_basic Temperature
# BME280 sensor address (default address)
address = 0x76
# Initialize I2C bus
bus = smbus2.SMBus(1)
# Load calibration parameters
calibration_params = bme280.load_calibration_params(bus, address)
# to activate loop
y = int(1)
#Temperature loop
while y == 2:
      data = bme280.sample(bus, address, calibration_params)

      # Extract temperature, pressure, and humidity
      temperature_celsius = data.temperature      
      # Print the readings
      print("Temperature: {:.2f} °C".format(temperature_celsius))
      # Wait for a few seconds before the next reading
      time.sleep(2)
      #print(y)
else:
      print("stopped") 
    
#Connection successfull
def on_connect(client, userdata, flags, rc):
  print("Connected to MQTT broker")


#Checking for messages to execute code
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
    if msg.payload.decode() == "temp_bme280_start":
        print("Calling script to for temperature start...")
        # activate loop by adding 1
        y += 1   
        print(y)
    if msg.payload.decode() == "temp_bme280_stop":
        print("Calling script to for temperature stop...")
        # deactivate loop by remove 1
        y -= 1  
        print(y)  

def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed to topic : " + str(mid) +" with QoS" + str(granted_qos))

client = mqtt.Client()

client.username_pw_set( "userxxx" , "passwortxxx" )

client.connect( "192.16x.xxx.xxx", 1883, 60)

client.subscribe( "frame/monitor" , qos=1)

client.on_connect = on_connect

client.on_message = on_message

client.loop_forever()

Würde Chat GPT sowas lösen können?

Code, Programmiersprache, Python, Script, Python 3, Raspberry Pi, while-Schleife, ChatGPT

Meistgelesene Beiträge zum Thema Script