C# Win Ordnerpfad automatisch zusammenstellen per Script

Lu De

Newbie
Registriert
Feb. 2022
Beiträge
3
Hallo Zusammen,
Ich habe noch nicht viel Programmiererfahrung mit C#...
Ware mal SPS-Programmierer, also ist mir das Programmieren nicht so Fremd. C-Erfahrungen sind ebenfalls vorhanden.

Nun zum Problem:
Ich habe eine weile mit AutoHotkey herumexperementiert und mir eine Funktion gebastelt, die mir Ordnerpfade erstellt. Es wird also einfach die Tastatur von Autohotkey bedient.
Bei Programmen muss man immer den Pfad auswählen wo es hingespeichert werden soll

Diesen Pfad benötige ich in der Zwischenablage:
F:\12xx\1298 Dieser Teil verändert sich\1298_100 Verändert Sich\

Bisheriger Ablauf:

Ich markiere die Infos die ich benötige z.B. 1298_100.
Das Script wird gestartet und:
• öffnet mit WIN+E den Explorer, und markiert mit STG+L die Leiste
• Es gibt automatisch F:\+ ersten beiden Zeichen vom Eingefügten ein (12)
• Der explorer Schlägt dann F:\12xx\ vor.
• Mit PFeiltaste nach unten wählt das Script das aus.
•Es wird der weitere Teil hinen angefügt: 1298
• Explorer schlägt wieder das passende Ergebnis vor, mit Nach unten auswählen
• 1298_100 wird angefügt und wieder vorgeschlagen und wieder ausgewählt.
Das ganze wird dann kopiert, dass ich das unter dem Speichern Unter-pfad gleich reinkopieren kann.

(Die Ordner-Teile, die sich verändern lassen sind immer anders, aber durch die Nummer vorne dran eindeutig.)

Ich habe 1298_100 und bekomme F:\12xx\1298 Dieser Teil verndert sich\1298_100 Verändert Sich\ raus.

Jetzt die Frage: Wie mache ich das in c# ?
Funktioniert das überhaupt?
kann man das im Hintergrund erledigen?
Nach was muss ich Googeln?


Vielen Dank schonmal für eure Hilfe!
 
Zuletzt bearbeitet:
WIllkommen,

bisschen sehr knapp formuliert dein Anliegen, sodass man jetzt nur raten kann was du eigentlich vorhast. Das nächste mal bitte etwas besser ausformulieren - solche Einzeiler kommen selten gut an.

Ansonsten fange ich mal an mit raten:
Kann dein Vorhaben nicht einfach mit den bestehenden Windows Environment-Variablen umgesetzt werden?

https://pctipps.de/environment-vari...ablen_in_Windows_10_anzeigen_lassen_Methode_2
https://docs.microsoft.com/de-de/dotnet/api/system.environment?view=net-6.0
 
Wenn du das im Hintergrund erledigen willst, dann wäre ein Zwischenablage-Hook wohl am sinnvollsten.

Also Anlaufstelle für das Auffinden des Verzeichnisses dürfte im System.IO-Namespace sein, konkreter die Klasse Directory

Bin aber skeptisch, dass du das selbst hinbekommst.

Edit: Der Ausgangsbeitrag wurde editiert, damit ist mein Hinweis an @Der Lord auf einer falschen Ausgangsbasis.

@Der Lord:
Also auch wenn ich zustimme, dass es etwas knapp formuliert ist und nach XY-Problem riecht, verstehe ich nicht ganz, was du ihm mit den Umgebungsvariablen sagen willst.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Lu De
Also du möchtest dein Script nicht fernsteuern (z.B. Process -> https://www.mindstick.com/articles/628/process-start-in-c-sharp-with-examples,) sondern quasi die Funktionalität in C# nachprogrammieren.

Wenn die Zwischenablage essentiel ist, dann werfe ich mal die Clipboard-Klasse https://docs.microsoft.com/en-us/dotnet/api/system.windows.clipboard?view=windowsdesktop-6.0 in den Raum.

In Qt gibt es die QTimer Klasse. Denke, dass es in C# eine ähnliche Klasse gibt, welche unter anderem Intervalloptionen anbietet.
 
Wieso sollte er einen neuen Prozess starten wollen? Und wozu den Timer? Um intervallweise den Inhalt zu pollen? oO
 
tollertyp schrieb:
Wenn du das im Hintergrund erledigen willst, dann wäre ein Zwischenablage-Hook wohl am sinnvollsten.
Ja, sieht gut aus. Das wäre wohl am naheliegendsten. Das mit dem Timer ist eher mähh. Man müsste ja dann zumindest überprüfen, ob der String ein korrekter Pfad wäre (da gibt es in C# bestimmt auch Klassen dafür), bevor man diesen zerlegt (oder zerlegen lässt).
 
  • Gefällt mir
Reaktionen: Lu De
Yo, über die entsprechenden System.IO-Klassen dann. Und wenn es ein passender (gültiger) ist, den ermittelten Pfad dann in die Zwischenablage legen.

Idealerweise würde ich noch schauen, dass evtl auch eine Benachrichtigung kommt, dass man als Nutzer Rückmeldung hat, dass das geklappt hat.
 
  • Gefällt mir
Reaktionen: Lu De
tollertyp schrieb:
Wieso sollte er einen neuen Prozess starten wollen?
Nun ja. Wegen einem möglichem XY-Problem. Er hat ja ein Script schon. Er müsste es ja nicht neu implementieren. Es könnte natürlich sein, dass er erweiterte Funktionalität braucht, die er nur mit C# bekommt. Vielleicht will er ja nur mal testen, ob er das gleiche auch mit C# hinbekommt - und sonst nichts.

Und mit dem Prozess könnte er benutzen um sein AutoHotkey-Dingens zu starten, usw. Was man halt alles mit so einem Prozess machen kann.
 
Er will ja wohl weg von dem unbequemen AutoIt-Script, und möchte, dass sein Tool alles macht - das wäre zumindest meine Annahme. Der Titel des Threads heißt ja nicht grundlos, dass der Pfad in C# bestimmt werden soll, und nicht dass ein Script via C# aufgerufen werden soll.

Ach, wobei da wieder "per Script" drin steht, ach mir egal, bin wie gesagt eh skeptisch, dass er das schafft, denn eigentlich sind das Dinge, die man sogar mit wenig Kenntnissen hätte via Google selbst rausfinden können.
 
tollertyp schrieb:
Der Titel des Threads heißt ja nicht grundlos, dass der Pfad in C# bestimmt werden soll, und nicht dass ein Script via C# aufgerufen werden soll.
Okay, wo du recht hast, hast du recht. Den Titel hatte ich wohl schon ausgeblendet. Ich wollte ihm nur eine Option anbieten (wobei ich ja implizit schon davon ausging, dass das nicht ist, was er will). Und Pfad bestimmen....hmm...nun ja, er hatte es ja in der Abhandlung seines Scripts ganz gut erläutert.

Um intervallweise den Inhalt zu pollen?
tollertyp schrieb:
Um intervallweise den Inhalt zu pollen? oO

Warum denn nicht? :)

Alle 500ms ein Zugriff auf die Zwischenablage. Dann prüfen ob valide. Dann schauen, ob der Pfad überhaupt ein anderer als der vorherige ist...usw.

Aus deinem Link:
Clipboard scheint ja kein ClipboardChanged zu bieten. Dann müsste man schon eine externe Bibliothek benutzen. Und InteropServices als Anfänger zu nutzen (schön mit WinAPI verquirlen) - weiß nicht. Wobei wenn die Snippets funktionieren, dann funktionieren sie - und dann ist das natürlich gut (auch ich würde da Copy and Paste einfach bevorzugen) .:)

Dass mit den Hooks wäre natürlich die beste aller Lösungen. Hatte ich dir schon bestätigt. :heilig:Ein Timer. Nun ja, wozu wenn man auf Hooks zurückgreifen kann.

Aber ich denke, dass jetzt mal ein Stichwörter und Links geposted wurden, sodass dem Threadersteller erstmal geholfen wurde.
 
Zuletzt bearbeitet:
tollertyp schrieb:
Edit: Der Ausgangsbeitrag wurde editiert, damit ist mein Hinweis an @Der Lord auf einer falschen Ausgangsbasis.
Danke für deinen Edit. :) Denn als ich schrieb, war nur von "Win Ordnerpfad automatisch zusammenstellen per Script" die Rede - wirklich nicht ein einziges Wort mehr. Das kann ja wahrlich alles mögliche bedeuten. :freak:
Vor allem wenn man die später hinzugefügte Ausformulierung betrachtet merkt man, dass hier der Einzeiler nie im Leben zum Ziel geführt hätte.

Aber nun wo das Ziel klarer definiert wurde, überlasse ich das Feld den C#-Profis. :D
 
Der Lord schrieb:
Danke für deinen Edit. :) Denn als ich schrieb, war nur von "Win Ordnerpfad automatisch zusammenstellen per Script" die Rede - wirklich nicht ein einziges Wort mehr. Das kann ja wahrlich alles mögliche bedeuten. :freak:
Vor allem wenn man die später hinzugefügte Ausformulierung betrachtet merkt man, dass hier der Einzeiler nie im Leben zum Ziel geführt hätte.

Aber nun wo das Ziel klarer definiert wurde, überlasse ich das Feld den C#-Profis. :D
Uh, sorry für die Verwirrung! STRG+ENTER hatte die Frage schon abgeschickt....
Wollte nur die nächste zeile :D
Ergänzung ()

Ich bin überwältigt von den Antworten! Danke!
Gegoogelt hatte ich schon... Aber wusste nichtmal wonach ich suchen soll...

Zwischenablage-Hook
System.IO-Namespace
die Klasse Directory
Danke,
Da kann ich mich morgen mal ran machen.

Der ganze Hintergrund: ich habe festgestellt, dass man in dem Programm für das ich die Anwendung brauche c# Programme ausführen kann, Scripte nennt sich das da.
Ist für die Arbeit und autohotkey nur eine Notlösung. Funktioniert meistens, muss nur öfter mal die Wait/sleep timer anpassen, weil WINDOWS immer mal unterschiedlich lange braucht.
(Ich schicke quasi sende Win+E, sleep 500ms, sende Stg+L, sleep 400ms...)
Funktioniert soweit, aber es öffnen sich Fenster, Sachen werden eingegeben und das kommt nicht so gut, wenn der Chef hinten dran steht.
Ich mache so nicht 25x am Tag das gleiche stumpfe durch-alle-Ordner klicken,(3min) sondern das erledigt sich in 8 Sekunden. UND verklickt sich nicht :D

Grüße und fettes DANKE!!!
 
Zuletzt bearbeitet:
So nun ist einige Zeit vergangen und Dank eurer Hilfe funktioniert es jetzt.

Mit der System.IO und der Directory Klasse funktioniert es absolut perfekt.

Code:
if (Directory.Exists(auftragBereichOrdner))
        {
            string[] auftragOrdnerArr = Directory.GetDirectories(auftragBereichOrdner);
            auftragOrdner = Array.Find(auftragOrdnerArr, delegate(string name)
             { return name.Contains(auftrag); }); // Rückgabewert
            
            if (auftragOrdner != "")
            {
                string[] auftragPosOrdnerArr = Directory.GetDirectories(auftragOrdner);
               // MessageBox.Show("Gruesse aus der zweiten If-Schleife\n\n" + auftragPosOrdnerArr[0]);
                aufposOrdner = Array.Find(auftragPosOrdnerArr, delegate(string name2)
                { return name2.Contains(auftrag + "_" + aufpos); }); // Rückgabewert
                
            }

        }
        else
        {
            // Fehlermeldung, wenn Auftrags-Ordner nicht gefunden wurde
            MessageBox.Show("Auftragordner konnte nicht gefunden werden!");
        }


So in etwa habe ich das gelöst.
Schaue ob der Pfad existiert und durchsuche die Ergebnisse nach dem gewünschten.... und das ganze nochmal für den nächsten Inneren Ordner.

Das tolle Programm, dass den Code dann ausführt hat keinen Debugger.
Beschwert sich nur, wenn es beim Fehler nicht weiterkompilieren kann. Mit der Messagebox-debugging Methode ging es aber :D

Bitte nicht über die Formatierung usw. beschweren :D
habe die Code-Schnipsel aus euren Tipps zusammengetragen und zusammengefügt, damit die gewünschte Funktion herauskommt.

DANKE!
Ergänzung ()

Prinzipiell habe ich diesen Autohotkey-code "nur" in c# übertragen.
Ist dadurch aber viel zuverlässiger und schneller geworden.

Hier im Forum habe ich mir da schon einiges angelesen.

Die Zwischenablage verwende ich auch noch:
end-Pfad dann alles Zusammengesetzt: "F:\12xx\1298 Dieser Teil verändert sich\1298_100 Verändert Sich\"
Code:
Clipboard.SetDataObject(endPfad);

//System.Windows.Forms.Clipboard.SetText(endPfad);
//Clipboard.SetText("Hallo Welt");
[CODE]

Nur die Nicht-kommentierte version funktioniert in dem Programm.
Am PC ist die unendliche Win-Zwischenablage eingeschaltet.
Ich kann den String in der Zwischanablage sehen mit Win+V aber er lässt ich nicht einfügen.

Wenn ich irgendetwas anderes Kopiere, kann ich dann über die Win+V den Eigentlichen Pfad überall hinkopieren.

habe ich da was vergessen?
Oder ist das Problem zu Programmspezifisch?


MfG
 
Zuletzt bearbeitet:
Zurück
Oben