amateur01
Goto Top

exe Datei zum Öffnen einer anderen Datei

Hallo, ich ein kompletter Anfänger, der ein kleines Programm schreiben wollte, um einen Löschvorgang zu automatisieren.

Irgendwann hatte ich dann eine Batch-Datei, die ihren Zweck erfüllte. Soll heißen, sie sucht die Datei erst auf Basis ihrer Dateinamenserwiterung und ruft ein Programm auf, um die heruntergeladene Datei zu öffnen und zu verarbeiten. Danach löscht sie alles, was ich nicht brauche.
unbenannt2
Nun wollte ich aber nicht jedes Mal jedes Mal erst die Datei herunterladen und dann meine Batch starten, also dachte ich mir ich kompiliere sie in eine ausführbare Datei und benutze sie, um damit gleich die herunterzuladene Datei zu öffnen und nach ein bisschen herumprobieren habe ich es dann hinbekommen.
unbenannt
Das Problem ist, dass der Lösch-Anteil des Codes nicht ausgeführt wird, wenn ich die Datei zum Öffnen verwende. Starte ich das Programm alleine klappt alles und ich bin jetzt ziemlich ratlos. Es wäre echt nett, wenn jemadn helfen könnte. Das ist übgrigens mein erster Beitrag, also habt bitte Nachsicht :D Ich bin mir auch nicht sicher, welches Thema hier richtig wäre lol

Content-ID: 353220

Url: https://administrator.de/contentid/353220

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

rubberman
rubberman 30.10.2017 um 11:57:35 Uhr
Goto Top
Ich hab keine Ahnung was du da vorhast.

Zitat von @Amateur01:
Nun wollte ich aber nicht jedes Mal jedes Mal erst die Datei herunterladen
Mal abgesehen davon, dass das in deinen Scripts auch nicht erfolgt, wo soll denn die Datei herkommen?

Zitat von @Amateur01:
also dachte ich mir ich kompiliere sie in eine ausführbare Datei und benutze sie, um damit gleich die herunterzuladene Datei zu öffnen
Batchdateien lassen sich nicht kompilieren. Du kannst sie in eine Art selbstextrahierendes Archiv oder Installer mit Erweiterung .exe packen lassen. Die packen dann aber auch nur dein Originalscript irgendwo ins %temp% Verzeichnis und führen es aus. Ist also völlig nutzlos und ich weiß auch nicht was das mit deinem Problem zu tun haben soll.

Zitat von @Amateur01:
Das Problem ist, dass der Lösch-Anteil des Codes nicht ausgeführt wird, wenn ich die Datei zum Öffnen verwende. Starte ich das Programm alleine klappt alles und ich bin jetzt ziemlich ratlos.
Ich verstehe kein Wort, sorry.

Steffen
MasterBlaster88
MasterBlaster88 01.11.2017 um 12:04:20 Uhr
Goto Top
Zitat von @rubberman:
Ich verstehe kein Wort, sorry.

Steffen

Hab schon an mir gezweifelt. Bin froh, dass es nicht nur mir so geht
Amateur01
Amateur01 01.11.2017 um 17:35:13 Uhr
Goto Top
Hi Steffen, tut mir leid, dass esso unverständlich war. Ich war nie besonders gut darin mich zu erklären :/ Was ich meinte, ist dass ich anstatt die Datei erst einmal zu speichern und dann das Programm auszuführen, es so wie auf dem Bild machen wollte.
unbenannt3

Batchdateien lassen sich nicht kompilieren. Du kannst sie in eine Art selbstextrahierendes Archiv oder Installer mit Erweiterung .exe packen lassen. Die packen dann aber auch nur dein Originalscript irgendwo ins %temp% Verzeichnis und führen es aus. Ist also völlig nutzlos und ich weiß auch nicht was das mit deinem Problem zu tun haben soll.

Ich sollte aufhören mit Begriffen ruumzuschmeißen, die ich nicht richtig verstehe. Auf jeden Fall habe ich die Datei einfach in einen Batch zu exe Converter getan und wenn ich die exe-Datei bentutze um das Heruntergeladene zu öffnen, funktioniert es soweit, dass das Programm aufgerufen wird, aber der Teil danach wird nicht umgesetzt. Es wird einfach nichts gelöscht.

Ich hoffe das war klarer und vielen Dank für deine Antwort.
Amateur01
Amateur01 01.11.2017 um 17:36:30 Uhr
Goto Top
Ups das war der Falsche :D
Amateur01
Amateur01 01.11.2017 um 17:39:57 Uhr
Goto Top
Hi Steffen, tut mir leid, dass es so unverständlich war. Ich war nie besonders gut darin mich zu erklären :/ Was ich meinte, ist dass ich, anstatt die Datei erst einmal zu speichern und dann das Programm auszuführen, es so wie auf dem Bild machen wollte.
unbenannt3

Batchdateien lassen sich nicht kompilieren. Du kannst sie in eine Art selbstextrahierendes Archiv oder Installer mit Erweiterung .exe packen lassen. Die packen dann aber auch nur dein Originalscript irgendwo ins %temp% Verzeichnis und führen es aus. Ist also völlig nutzlos und ich weiß auch nicht was das mit deinem Problem zu tun haben soll.


Ich sollte aufhören mit Begriffen rumzuschmeißen, die ich nicht richtig verstehe. Auf jeden Fall habe ich die Datei einfach in einen Batch zu exe Converter getan und wenn ich die exe-Datei bentutze um das Heruntergeladene zu öffnen, funktioniert es soweit, dass das Programm aufgerufen wird, aber der Teil danach wird nicht umgesetzt. Es wird einfach nichts gelöscht.

Ich hoffe das war klarer und vielen Dank für deine Antwort.
rubberman
rubberman 02.11.2017 um 18:30:49 Uhr
Goto Top
Zitat von @Amateur01:
Was ich meinte, ist dass ich anstatt die Datei erst einmal zu speichern und dann das Programm auszuführen, es so wie auf dem Bild machen wollte.
Machst du doch mit dem START Befehl.

wenn ich die exe-Datei bentutze um das Heruntergeladene zu öffnen, funktioniert es soweit, dass das Programm aufgerufen wird, aber der Teil danach wird nicht umgesetzt.
Was aber nichts damit zu tun hat, dass du das Script mit diesem Bat2Exe Mist konvertiert hast. Das geht auch mit dem Script pur. Wie schon gesagt, am Ende wird sowieso nur dein Script wieder ausgepackt und ausgeführt.

Es wird einfach nichts gelöscht.
Das sieht auch alles ein bisschen suspekt aus. Vielleicht erklärst du einfach mal Schritt für Schritt was wie wo passieren soll. Aus irgendwelchen Gründen scheinen bei dir *.osz Dateien in das TEMP Verzeichnis zu wandern, die du dann öffnest. Soweit so gut. Dann willst du irgendwas aus "%localappdata%\osu!\Songs" auf merkwürdige Art und Weise löschen. Was genau soll denn da passieren?

Steffen
Amateur01
Amateur01 03.11.2017 um 14:58:59 Uhr
Goto Top
Also erst sollen aus dem Ordner "C:\Users\Bini\AppData\Local\osu!\Songs" und dessen Unterordnern alle Dateien aufgelistet werden, die nicht die Dateinamenserweiterung .osu oder .mp3 haben. Diese Liste soll in der Texdatei "Zwischenspeicher.txt" gespeichert werden und das "/a-d" ist dafür da, dass die Unterordner selbst nicht auf die Liste kommen. Den Zwischenschritt habe ich eingebaut, weil ich nach vielen vergeblichen Versuchen gelesen habe, dass man in die For-Schleife nur einen Befehl schreiben kann. Ich brauche ja aber sowohl den "dir" als auch den "findstr" Befehl. Als Nächstes soll der Zwischenspeicher halt zeilenweise abgearbeitet und alles, was drin steht, gelöscht werden. Und das war es auch eigentlich. Die Pause ist übrigens da, damit der zu löschende Inhalt erst entstehen kann. Wenn diese Datei geöffnet wird,
unbenannt4
entsteht dieser Ordner
unbenannt5
und das dauert ein, zwei Sekunden.
rubberman
rubberman 03.11.2017 aktualisiert um 16:34:14 Uhr
Goto Top
Ungetestet
for /r %%i in ("%localappdata%\osu!\Songs\*.*") do if /i "%%~xi" neq ".osu" if /i "%%~xi" neq ".mp3" del /f "%%~i"  
Ohne Zwischenspeicher.
Und wenn das so im Script funktioniert aber nicht mehr im Bat2Exe Gedöns, dann sag ichs nochmal - lass es weg und arbeite mit dem Script.

Steffen
Amateur01
Amateur01 03.11.2017 um 17:04:27 Uhr
Goto Top
Das hat nicht geklappt :/ Und das Problem liegt glaub ich auch nicht bei der Konvertierung. Die Exe-Datei funktioniert ja, wenn ich sie von alleine starte. Aber wenn ich sie auswähle, um damit die heruntergeladene Datei zu öffnen hakt es halt. Danke, dass du dir das überhaupt noch antust. Das gleiche gilt auch für das Skript: Wenn ich die Datei speichere, sie dann rechtsklicke, auf "Öffnen mit" gehe und die Batch-Datei(bei der ich den Dateipfad wieder angepasst habe) aussuche, passiert genau das Gleiche.
rubberman
rubberman 03.11.2017 um 18:37:08 Uhr
Goto Top
(bei der ich den Dateipfad wieder angepasst habe)
Das wäre wohl nicht nötig gewesen. Die Variable %localappdata% zeigt auf das richtige Verzeichnis im Benutzerprofil.

Aber wenn ich sie auswähle, um damit die heruntergeladene Datei zu öffnen
Jetzt komm ich langsam dahinter, was du überhaupt vorhast. Du wählst eine bestimmte Datei per Rechtstklick aus und willst sie über das Kontextmenü öffnen. Lässt sich machen. Aber erst noch mal zu der Löschaktion: Wann werden die zu löschenden Dateien erzeugt? Da du diese osu!.exe mit dem START Befehl ausführst, wird diese asynchron ausgeführt. Das bedeutet, das Script wartet nicht darauf bis osu!.exe öffnet, irgendwas macht oder beendet wird, sondern geht direkt zum Löschen. Falls die zu löschenden Dateien erst von osu!.exe erzeugt werden, existieren sie vermutlich nicht, wenn du sie löschen willst. Aber die Info kannst nur du geben...

Steffen
Amateur01
Amateur01 03.11.2017 um 19:50:01 Uhr
Goto Top
Ich habe die osu!.exe absichtlich asynchron ausführen lassen, weil das Löschen sonst immer erst passiert ist, nachdem ich osu! wieder geschlossen habe und die Dateien werden erzeugt, wenn osu! geöffnet wird. Deshalb habe ich die 3 Sekunden Pause zwischen dem Öffnen und Löschen eingebaut. Die Dateien sind auf jeden Fall schon vorhanden.
rubberman
Lösung rubberman 03.11.2017 aktualisiert um 21:53:58 Uhr
Goto Top
OK, verstanden.

Speichere folgenden Code in irgendeine .bat Datei und führe ihn aus.
@if (@a)==(@b) @end /*
@echo off &setlocal
2>nul md "C:\myTools" 
>"C:\myTools\SendToOsu!.bat" ( 
  echo @echo off ^&setlocal
  echo if exist "%%~1\" exit /b 
  echo if /i "%%~x1" neq ".osz" exit /b 
  echo start "" "%%localappdata%%\osu!\osu!.exe" %%1 
  echo ^>nul timeout /t 3 /nobreak
  echo for /r "%%localappdata%%\osu!\Songs" %%%%i in ("*.*"^) do if /i "%%%%~xi" neq ".osu" if /i "%%%%~xi" neq ".mp3" del /f "%%%%~i" 
)
cscript //nologo //e:jscript "%~fs0" 
goto :eof */
var objWSHShell = new ActiveXObject('WScript.Shell'), objShortcut = objWSHShell.CreateShortcut(objWSHShell.SpecialFolders.Item('SendTo') + '\\osu!.lnk');  
objShortcut.TargetPath = 'C:\\myTools\\SendToOsu!.bat';  
objShortcut.WindowStyle = 7;
objShortcut.Save();
Jetzt drücke die F5 Taste auf dem Desktop oder einem geöffneten Explorerfenster.
Wenn alles so funktioniert, wie ich mir das denke, dann hast du jetzt bei Rechtsklick auf eine .osz Datei im Menüpunkt "Senden an" ein "osu!"... Teste mal.

Steffen
Amateur01
Amateur01 03.11.2017 um 21:22:36 Uhr
Goto Top
Es funktioniert perfekt, vielen Dank für die Mühe. Ich verstehe bloß leider überhaupt nicht, was da passiert. Könntest du mir das kurz erklären oder würde das den Rahmen sprengen?
rubberman
Lösung rubberman 03.11.2017 aktualisiert um 22:26:01 Uhr
Goto Top
Zitat von @Amateur01:
würde das den Rahmen sprengen?
Nein. Ich freue mich eher über jemanden der nicht nur stumpf Code kopiert.

Der obige Batchcode erstellt ein Verzeichnis "C:\myTools" und schreibt dort eine "SendToOsu!.bat". Danach wird mit einem kurzen JScript eine Verknüpfung auf diese Batchdatei mit Name "osu!" im Verzeichnis
"C:\Users\Bini\AppData\Roaming\Microsoft\Windows\SendTo"
erstellt. Dort befinden sich alle Verknüpfungen, die im "Senden an" Menüpunkt zu finden sind.

Um zu verstehen was in "SendToOsu!.bat" passiert, hier erst mal ein ganz kurzer Beispielcode:
@echo off
echo %1
pause
Wenn du eine andere Datei auf dieses Script ziehst, dann öffnet es sich und zeigt dir den vollen Dateiname an. Der Wert der Parametervariablen %1 ist das erste Argument, das an das Script übergeben wurde. In diesem Fall also der Dateipfad.

Genauso verhält es sich nun beim "Senden an" Menü. Der Dateipfad, den du dort an die Verknüpfung übergibst, landet letztlich als %1 im Script "C:\myTools\SendToOsu!.bat". Die hat folgenden Inhalt (kannst du dir natürlich auch live in deinem Verzeichnis ansehen):
@echo off &setlocal
if exist "%~1\" exit /b  
if /i "%~x1" neq ".osz" exit /b  
start "" "%localappdata%\osu!\osu!.exe" %1  
>nul timeout /t 3 /nobreak
for /r "%localappdata%\osu!\Songs" %%i in ("*.*") do if /i "%%~xi" neq ".osu" if /i "%%~xi" neq ".mp3" del /f "%%~i"  

Zeilenweise erklärt:
if exist "%~1\" exit /b
Wenn das übergebene Argument ein Verzeichnis ist (was der Backslash hinter dem Parameter aussagt), dann beende das Script sofort.

if /i "%~x1" neq ".osz" exit /b
Wenn die Dateiendung des übergebenen Arguments nicht ".osz" ist, dann beende das Script sofort.

start "" "%localappdata%\osu!\osu!.exe" %1
Starte "osu!.exe" asynchron und übergib den Dateipfad in %1 als Argument.

>nul timeout /t 3 /nobreak
Warte 3 Sekunden.

for /r "%localappdata%\osu!\Songs" %%i in ("*.*") do if /i "%%~xi" neq ".osu" if /i "%%~xi" neq ".mp3" del /f "%%~i"
Durchsuche "%localappdata%\osu!\Songs" rekursiv nach allen Dateien und weise sie nacheinander in den Schleifeniterationen %%i zu. Wenn die Dateiendung nicht ".osu" und nicht ".mp3" ist, lösche die Datei.

Führe ein CALL /?in einem CMD Fenster aus, um zu verstehen was die Modifikatoren mit vorangestelltem ~ Zeichen mit Parameter- und Schleifenvariablen tun.

Steffen
Amateur01
Amateur01 04.11.2017 um 08:31:59 Uhr
Goto Top
Ok super. Vielen Dank nochmal, du hast mir echt weitergeholfen.