alex-it02
Goto Top

.bat - File für das gezielte Ausgeben einer Datei?

Es handelt sich um einen Wunsch aus unserer Logistik.
Es soll ein PC zur Verfügung gestellt werden der lediglich für das Finden und Anzeigen verschiedener Artikel sein soll.
Und das Programm sollte am besten so einfach wie möglich sein und bestenfalls mit Boardmitteln.

Guten Morgen Liebe Anwesende des Forums =)

ich brauche ein kleines Programm, am besten mit Boardmitteln, welches in einem Ordner (und seinen Unterordnern) nach diversen Artikelnnummern sucht, und diese dann maximiert auf dem Bildschirm ausgibt. --> PDF´s

Hintergrund der Geschichte ist, dass bestimmte Mitarbeiter verschiedene Einzelteile zusammenfügen müssen. Um die Fehlerqote zu dezimieren möchte der Produktionsleiter einen
PC zur Verfügung gestellt bekommen, an welchem die MA

  • nichts haben ausser ein Eingabefenster indem auch nichts anderes eingegeben werden kann als 5 Numerische Zeichen, sprich Zahlen.
  • Nach Eingabe der 5 Zahlen soll nach dem Artikel gesucht werden.
  • Ist dieser vorhanden soll das PDF gleich aufgemacht werden.
  • Ist der Artikeln nicht vorhanden so soll ein klassischer Fehler Text ausgegeben werden wie: "Artikelnummer falsch oder nicht vorhanden".

Die Suche erfolgt über ein Netzwerk, sprich die Daten liegen auf dem Server und der PC ist im Netzwerk, vlt relevant.

Kann mir bitte wer bei der Erstellung dieses kleinen .Bat Files behilflich sein?

Ich war ja bereits bei:

@echo off
:start
cls
title "Artikelnummer eingeben"
@echo Bitte tippen Sie die Artikelnummer ein

set /p Artikel=
dir Pfad\%Artikel%**.pdf /s

aber dass ist weniger als eine Lösung, der Artikel wird gefunden, aber wie ich diese directory dann verwende und gleich im nächsten Befehl öffne, ein Rätsel. Ebenso wäre eine GUI ganz nett, sodass wie gesagt, Nur ein riesen Fenster ist mit einer Eingabemöglichkeit von 5 Zahlen und sonst nichts. Kein Zugriff möglich, kein Bearbeiten möglich, kein Schließen des Fensters möglich.
Das Schließen des PDFs schon, anschließend soll man aber gleich wieder beim Eingabefenster sein.

Ich bin leider kein Programmierer, aber ich kann mir vorstellen dass das mit VisualBasic oder C# mehr als Idioteneinfach erreicht werden kann, jedoch besitzen wir soetwas in der Arbeit nicht und meine Kentnisse sind zu gering.

Ich bedanke mich jetzt schon bei den fleißigen Menschen hier =)=) auch wenn mein letzter Artikel auch nicht gelöst werden konnte... =/

Lg Alex

Content-Key: 174433

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

Printed on: April 23, 2024 at 08:04 o'clock

Member: godlie
godlie Oct 11, 2011 at 06:31:54 (UTC)
Goto Top
Hallo ich glaube http://www.autoitscript.com/site/autoit/ wäre was für dich.
Member: Alex-IT02
Alex-IT02 Oct 11, 2011 at 06:53:55 (UTC)
Goto Top
Hello,

das war ja schon mal ne sehr schnelle Antwort =)
Ich habe das Programm schon mal heruntergeladen und werd mir jetzt eine passende Description suchen.

Hast du schon Erfahrungen mit dem Ding?

Ich meld mich wieder wenn ich weiß ob ich damit klar komm.

Lg
Member: Alex-IT02
Alex-IT02 Oct 11, 2011 at 11:57:50 (UTC)
Goto Top
ich kapituliere, das Programm ist bestimmt sehr gut, aber dementsprechend auch sehr umfangreich.

Wenn ich auf die Uhr schaue und seh wieviel Stunden vergangen sind und wieviel arbeit ich heute nicht geschafft hab
und dennoch nicht klüger worden bin, sehe ich keine gute Bilanz des heutigen Tages...
Member: bastla
bastla Oct 11, 2011 at 14:54:51 (UTC)
Goto Top
Hallo Alex-IT02!

Wenn Du Deinen Ansatz etwas abwandelst, etwa:
@echo off & setlocal
title Artikelnummer eingeben
set "Pfad=D:\Der Pfad"  
:start
cls
set /p Artikel=Bitte tippen Sie die Artikelnummer ein: 
if not defined Artikel goto :start
if exist "%Pfad%\%Artikel%.pdf" (  
    "%Pfad%\%Artikel%.pdf"  
) else (
    echo Artikel %Artikel% nicht gefunden!
    pause
)
goto :start
sollte das doch grundsätzlich mit Batch zu machen sein ...

Grüße
bastla
Member: Alex-IT02
Alex-IT02 Oct 12, 2011 at 07:32:49 (UTC)
Goto Top
Hallo bastla,

Ursprünglich habe ich es auch mit ner Batch-File versucht, aber als Amateur wurde das nix XD

@echo off
:start
cls
title "Artikelnummer eingeben"
@echo Bitte tippen Sie die Artikelnummer ein

set /p Artikel=
cd C:\
L:
cd CAD\
cd "Pfad"
dir %Artikel%**.pdf /s

pause

So hat es ausgesehen, aber iwie war ich zu blöd die Variablen richtig zu deklarieren. So konnte ich z.B. zwar den richtigen Pfad ausgeben, aber diesen dann nicht öffnen lassen.
Nächstes Problem war / ist dass im Pfad ein Verzeichnis folgenden Namen hat: "EC-Zeichnungen u. Prüfprotokolle", dass war denk ich auch ein Grund warums nicht ging? kann ich da in Zukunft iwas machen? Umlaute vermeiden??

Jetzt zu deinem Code, erstmals vielen Dank. Könntest du mir noch sagen was & setlocal macht? --> ist das für die Variablen oder dass das Echo off bleibt?

Ich habe es gerade probiert, Problem ist meiner Meinung nach das Verzeichnis "EC-Zeichnungen u. Prüfprotokolle". Weiters sollte auch nach Unterverzeichnissen gesucht werden, bei dem Befehl "dir" geht dass mit /s.
Aber das hilft mir nicht so weiter =/
Any Idea?

Dass mit AutoIT wäre ideal weil ich da den user davor sperren kann iwas anderes auf dem PC zu machen, mit Batch wird dass nicht gehen oder?
Es soll auf dem Pc wirklich NUR DASS funktionieren.

Lg Alex
Member: bastla
bastla Oct 12, 2011 at 08:32:16 (UTC)
Goto Top
Hallo Alex-IT02!

Vorweg: Was den Umlaut anlangt, kannst Du entweder den Batch mit einem ASCII-fähigen Editor (im schlimmsten Fall "edit" verwenden) erstellen oder am Anfang des Batches die Codepage mit
chcp 1252>nul
umschalten.
"setlocal" verwende ich standardmäßig - es wird damit festgelegt, dass nach dem Ende des Batches (oder nach einem expliziten "endlocal") alle Änderungen an Variablen (inkl aller neu erstellten) "vergessen" werden und damit nicht ev in einem weiteren Batch bereits (mit unerwünschten Werten) vorhanden wären.
Wenn Du auch Unterverzeichnisse mit einbeziehen willst, könnte das etwa so gehen (ungetestet):
@echo off & setlocal
title Artikelnummer eingeben
cd /d "L:\CAD\Pfad"  
:start
cls
set /p Artikel=Bitte tippen Sie die Artikelnummer ein: 
if not defined Artikel goto :start
dir  /s /b %Artikel%.pdf >nul 2>&1 && (
    for /f "delims=" %%i in ('dir /s /b "%Artikel%.pdf" 2^>nul') do "%%i"  
) || (
    echo Artikel %Artikel% nicht gefunden!
    pause
)
goto :start

Hinsichtlich der Anzeige noch ein Hinweis: Sollte es in verschiedenen Ordnern mehr als eine %Artikel%.pdf geben, werden alle geöffnet.

Grüße
bastla
Member: Alex-IT02
Alex-IT02 Oct 12, 2011 at 09:00:04 (UTC)
Goto Top
Alsooooo,

Er findet die Datei und er öffnet sie. Kannst du mir vlt noch verraten wo ich ein /MAX platzieren kann sodass das PDF maximiert erscheint?
Was jetzt auch lustig ist, ich kann keinen weiteren Artikel eingeben bevor ich das vorhanden PDF schließe, und wenn ich es schließe
bringt er anschließend sofort die Meldung :Artikel konnte nicht gefunden worden?

Er gibt also nur die Fehlermeldung aus wenn das PDF nicht geöffnet werden kann, schließe ich es, wurde es nicht geöffnet, so erhalte ich die Meldung?
Denk ich da richtig?

Und durch chcp 1252>nul erscheint jetzt beim Pausebefehl: Dr3cken Sie eine beliebige Taste, bekommt man dass noch iwie weg?

Und bastla? vielen Dank für deine Hilfe

Lg

Zusatz: Gibt es Möglichkeiten die Suche zu beschleunigen und die Eingabe auf Numerische Zeichen, sowie auf 5 Stück zu begrenzen?
Wie gesagt es soll wirklich Deppensicher gemacht werden =)=)
Member: bastla
bastla Oct 12, 2011 at 09:35:13 (UTC)
Goto Top
Hallo Alex-IT02!

Versuch's mal damit:
@echo off & setlocal
title Artikelnummer eingeben
chcp 1252>nul
cd /d "L:\CAD\Pfad"  
:start
cls
set /p Artikel=Bitte tippen Sie die Artikelnummer ein: 
if not defined Artikel goto :start
echo %Artikel%|findstr "[^0-9]">nul && goto :Start  
set "Artikel=%Artikel:~,5%"  
if "%Artikel:~4,1%"=="" goto :Start  
dir  /s /b %Artikel%.pdf >nul 2>&1 || (
    echo Artikel %Artikel% nicht gefunden!
    echo\
    echo Weiter mit Tastendruck ...
    pause>nul
    goto :start
)
for /f "delims=" %%i in ('dir /s /b "%Artikel%.pdf" 2^>nul') do start /MAX "Anzeige %%~nxi" "%%i"  
goto :start
Es wird jetzt die Eingabe auf
  • nicht leer
  • ausschließlich Ziffern
  • mindestens 5 Stellen
untersucht und bei mehr als 5 Stellen auf die ersten 5 Stellen gekürzt.
Suche beschleunigen ev mittels Indexdatei:
@echo off & setlocal
title Artikelnummer eingeben
set "Index=%temp%\Artikelindex.txt"  
set "Delim=;"  
del "%Index%" 2>nul  
chcp 1252>nul
cd /d "L:\CAD\Pfad"  
for /f "delims=" %%i in ('dir /s /b ?????.pdf') do >>"%Index%" echo %%~ni%Delim%%%~fi  
:start
cls
set /p Artikel=Bitte tippen Sie die Artikelnummer ein: 
if not defined Artikel goto :start
echo %Artikel%|findstr "[^0-9]">nul && goto :Start  
set "Artikel=%Artikel:~,5%"  
if "%Artikel:~4,1%"=="" goto :Start  
dir  /s /b %Artikel%.pdf >nul 2>&1 || (
    echo Artikel %Artikel% nicht gefunden!
    echo\
    echo Weiter mit Tastendruck ...
    pause>nul
    goto :start
)
for /f "tokens=1-2 delims=%Delim%" %%i in ('findstr /i /b "%Artikel%%Delim%" "%Index%"') do start /MAX "Artikel %%i" "%%j"  
goto :start
Für beide Ansätze habe ich das Testen Dir überlassen ... face-wink

Grüße
bastla
Member: Alex-IT02
Alex-IT02 Oct 12, 2011 at 10:20:27 (UTC)
Goto Top
Variante 1 hält was du versprichst =) funktioniert Tadellos.

Variante 2 hingegen schickt mich immer wieder an den Start, egal was ich eingebe. Ich mache z.B. bei Variante 1 bei Zeile 12 und 19 ein "" nach dem %Artikel% weil es verschiedene Endungen gibt wie -EN oder -DE vor dem .pdf.
Vielleicht hab ich dass bei Variante 2 zu wenig gesetzt.

Auf alle Fälle bin ich ganz "paff" was du da so anstellst. Ich hab viel im Internet recherchiert aber nichts annäherndes gefunden, geschweige Befehel wie tokens oder delim =)
Wo lernt man all diese Dinge? sehr sehr interessant und du genießt meinen vollsten Respekt =)

Ein paar Fragen hätte ich an dich, möchte mich ja weiterbilden und nicht nur fertige Lösungen.

Gehen wir zu Variante 1 weil Variante 2 check ich noch weniger mit der Index-Geschichte.

  • Zeile 4 -->ist die Definition des Startverzeichnisses und
  • zeile 7 -->die Variablendeklaration
  • Bezüglich Zeile 8, --> if not defined, steht für eine Eingabepflicht?
  • Zeile 9 ist die Beschränkung auf numerische Zeichen? Wobei dass echo doch eine Ausgabe ist?
--->%Artikel% wird überprüft ob 0-9 vorhanden ist, >nul heißt was? &&? ----> echo %Artikel%|findstr "[^0-9]">nul && goto :Start
  • Zeile 10, %Artikel:~,5% ~ ,5 ist die Beschränkung auf die ersten 5? wenn es 5,~ hieße, würden dann die letzten 5 berücksichtigt werden oder ist dass nicht so einfach?
  • Zeile 11, ~4,1%"=="" wenn das 5. Zeichen eine Leereingabe ist goto start?
  • Zeile 12 sucht in Verzeichnissen und Unterverzeichnissen, das >nul gibt welche Bedingung an?, ansonsten wird "nicht gefunden" ausgegeben.
  • Zeile 14 bis 17 ersetzt die "Drücken Sie eine beliebige Taste zum fortfahren"-Geschichte, welche Rolle spiellt dabei echo\? ------------- >nul besagt dass eine Eingabe getätigt werden muss, stimmt das?

jetzt dass Spannenste xD was heißt nachstehender Befehl?

  • for /f "delims=" %%i in ('dir /s /b "%Artikel%.pdf" 2^>nul') do start /MAX "Anzeige %%~nxi" "%%i"

for /f "delims???=" %%i ??? in (der vorher gesuchten Directory die gefunden werden musste ??2^>nul??) und das starte bitte maximiert ????"Anzeige %%~nxi" "%%i"????
for /f delims startet die Dir oder wie?

und bastla? wie bekomm i so ne hübsche Formatierung des Codes bei administrator.de hin =)

LG
Member: Alex-IT02
Alex-IT02 Oct 12, 2011 at 10:52:10 (UTC)
Goto Top
Eine Bitte hätte ich jetzt noch gerne, dann kann ich den Artikel als gelöst markieren.

Ich würde gerne die Bat mittels Konverter in eine Exe wandeln und somit in Autostart reinschmeissen falls das geht.
Deshalb bräuchte ich für den Input und der Textausgabe eine MsgBox.

Funktioniert dass? kann ich mir über die BAT eine InputBox aufpoppen lassen?

Lg
Member: bastla
bastla Oct 12, 2011 at 15:26:24 (UTC)
Goto Top
Hallo Alex-IT02!
Ich mache z.B. bei Variante 1 bei Zeile 12 und 19 ein "" nach dem %Artikel% weil es verschiedene Endungen gibt wie -EN oder -DE vor dem .pdf.
Damit ist der Dateiname aber nicht mehr genau 5 Zeichen lang, und nur nach solchen wird in der Indexdatei gesucht ...

Wenn Du die Zeile 23 auf
for /f "tokens=1-2 delims=%Delim%" %%i in ('findstr /i /b "%Artikel%" "%Index%"') do start /MAX "Artikel %%i" "%%j"
änderst, sollte auch Variante 2 funktionieren ...
Zu Deinen Fragen bzw den Codezeilen:
Zeile 4 -->ist die Definition des Startverzeichnisses und
Genauer: das Wechseln in das Startverzeichnis (ist danach aktuell und muss in weiterer Folge nicht mehr brücksichtigt werden)
zeile 7 -->die Variablendeklaration
Einfach nur eine Eingabe, die in der Variablen %Artikel% gespeichert wird.
Bezüglich Zeile 8, --> if not defined, steht für eine Eingabepflicht?
Wenn nix eingegeben, sondern nur "Enter" gefrückt wurde, ist die Variable %Artikel% nicht definiert.
Zeile 9 ist die Beschränkung auf numerische Zeichen? Wobei dass echo doch eine Ausgabe ist?
Die Ausgabe dient dazu, den Variableninhalt an "findstr" zu übergeben
--->%Artikel% wird überprüft ob 0-9 vorhanden ist, >nul heißt was? &&? ----> echo %Artikel%|findstr "[^0-9]">nul && goto :Start
Der Suchstring "[^0-9]" bedeutet: Suche nach einer Zeile (auch wenn nur eine einzige Zeile bzw ein String übergeben wird, arbeitet "findstr" zeilenorientiert), welche Zeichen, die nicht zwischen "0" und "9" liegen, enthält.
Zeile 10, %Artikel:~,5% ~ ,5 ist die Beschränkung auf die ersten 5? wenn es 5,~ hieße, würden dann die letzten 5 berücksichtigt werden oder ist dass nicht so einfach?
Die letzten 5 erhieltest Du mit "%Artikel:~-5%" - siehe dazu "set /?" ...
Zeile 11, ~4,1%"=="" wenn das 5. Zeichen eine Leereingabe ist goto start?
Wenn das 5. Zeichen nicht existiert (zwischen den Anführungszeichen steht ja genau "nix" face-wink) ...
Zeile 12 sucht in Verzeichnissen und Unterverzeichnissen, das >nul gibt welche Bedingung an?, ansonsten wird "nicht gefunden" ausgegeben.
Auch hier will ich die Ergebnisse nicht angezeigt bekommen, sondern nur feststellen, ob es passende Dateien gibt und danach wiederum anhand des Errorlevels reagieren können.
Zeile 14 bis 17 ersetzt die "Drücken Sie eine beliebige Taste zum fortfahren"-Geschichte, welche Rolle spiellt dabei echo\?
Mit "echo\" (anstelle des "\" könnden auch verschiedene andere Zeichen wie ".", "(", ",", - einfach ausprobieren face-wink - verwendet werden) wird eine Leerzeile ausgegeben.
>nul besagt dass eine Eingabe getätigt werden muss, stimmt das?
Nein - wie bereits erwähnt wird dadurch eine Ausgabe (hier die "Originalmeldung" des "pause"-Befehls) unterdrückt - gewartet wird auf den Tastendruck, weil "pause" ja trotzdem ausgeführt wird.
was heißt nachstehender Befehl?
for /f "delims=" %%i in ('dir /s /b "%Artikel%.pdf" 2^>nul') do start /MAX "Anzeige %%~nxi" "%%i"
Solche Schleifen sind immer am besten "von innen nach außen" zu lesen - es wird zunächst
dir /s /b "%Artikel%.pdf" 2^>nul
ausgeführt - Ergebnis: entweder eine Auflistung aller dem Suchmuster entsprechenden Dateien mit Pfadangabe (also etwa "L:\CAD\Pfad\Unterordner\15253.pdf") oder eine Fehlermeldung "Datei nicht gefunden" (die aber nicht angezeigt werden soll, weshalb der "Fehlerkanal" 2 nach "nul" umgeleitet wird; wäre nicht erforderlich, da ja vorweg schon festgestellt wurde, dass es zumindest eine passende Datei gibt).
Für jeden dieser Dateipfade wird nun (ohne ihn an ev enthaltenen Leerzeichen zu unterteilen - deshalb "delims=" ohne Angabe eines Trennzeichens, was bedeutet: verwende die Zeile "am Stück") der "do"-Teil ausgeführt, in welchem (wegen des Maximierungswunsches und damit der Batch nicht auf das Schließen wartet) der Befehl "start" verwendet wird.
Um den Dateipfad unter Anführungszeichen setzen zu können (weil er ev Leerzeichen enthält) muss vorweg auch schon ein Text unter Anführungszeichen verwendet werden (die Syntax von "start" erfordert das); der Fenstertitel "Anzeige " + Dateiname ("%%~nxi") würde aber tatsächlich nur bei einem weiteren CMD-Fenster zum Tragen kommen und fällt daher unter Spielerei - zwei Anführungszeichen ohne etwas dazwischen hätten es auch getan ... face-wink
Schön übrigens, dass Du nach der Code- fragst ...
Hinsichtlich der "MsgBox" oder einer "InputBox": Du kannst für Ersteres zwar
msg %username% Deine Nachricht
verwenden, aber ansonsten wäre dafür temporäres VBS geeignet ...

Grüße
bastla