schorsch112
Goto Top

Paramter aus Batch-Datei in Text-Datei schreiben, sobald diese nicht mehr verwendet wird

Hallo zusammen,

ich habe ein kleines Problem und da ich mich leider erst seit sehr kurzem mit dem Scripting von Batch-Dateien beschäftige, benötige ich eure Unterstützung.

Ich habe ein Windows-Programm, welches über Aktionen eine Batch-Datei öffnet und an diese Parameter (Strings) übergibt.
Die Batchdatei schreibt diese Parameter nun in eine Textdatei (zur weiteren Verarbeitung und Abruf durch andere Programme).

Soweit alles gut face-smile

Das Windows-Programm führt diese Aktionen aber teilweise so schnell hintereinander aus, dass die Batch die Daten nicht in die Textdatei schreiben kann, da diese Bereits durch die Batch der Vorgängeraktion blockiert wird. So kommen nicht alle Daten in der Textdatei an. (Ich hoffe das war verständlich)

Ich habe mir überlegt das Problem wie folgt zu lösen:

1.) Prüfe, ob Textdatei geöffnet
2.) Wenn ja, dann Warte einen Moment (Ping -n 3 127.0.0.1)
3.) Prüfe erneut
4.) Wenn Datei freigegeben (also nicht geöffnet) dann übertrage die Daten

In die Praxis sieht mein Versuch so aus:

:check
:loop
ping -n 3 127.0.0.1
GoTo Check
:end
echo %Date% %time:~0,8% >> C:\Users\\Desktop\TEST.txt
Pause

Mein Problem ist nun, dass ich die Prüfung, ob die Datei verwendet wird oder nicht, nicht hin bekomme.

Ich hoffe meine Frage ist nicht allzu dämlich!? face-smile

Ich würde mich über eine Antwort eurerseits freuen.

Ich bin auch gern für andere Lösungsvorschläge offen (ich hatte mal was von "Command line" gelesen aber das kenne ich nun garnciht).

Im Voraus vielen Dank!!!!

Beste Grüße

Schorsch112

Content-Key: 274573

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

Printed on: April 26, 2024 at 04:04 o'clock

Mitglied: 114757
114757 Jun 14, 2015 updated at 17:18:20 (UTC)
Goto Top
Moin Schorsch,
mit Powershell könnte ich dir was vernünftiges anbieten...
param(
   [string]$parameter1,
   [string]$parameter2,
   [string]$parameter3
)

# funktion die prüft ob eine Datei durch einen anderen Prozess blockiert ist.
function check([string]$filePath){
            try{
                $fileStream = (New-Object System.IO.FileInfo $filePath).OpenWrite()
                $fileStream.Close(); $fileStream.Dispose()
                # file is not locked by another process
                return $true
            }catch{
                # file is locked
                return $false
            }
 }

# Für den Fall das Datei locked ist wiederhole Zugriff alle 0,5 Sekunden
while(!(check 'c:\datei.txt')){  
  sleep -Milliseconds 500
}
# Als Beispiel Parameter1 in die Textdatei schreiben
$parameter1 | set-content 'c:\datei.txt'  
Gruß jodel32
Member: Schorsch112
Schorsch112 Jun 14, 2015 at 17:56:42 (UTC)
Goto Top
Hallo jodel32,

vielen Dank für Deine schnelle Antwort und Deine Mühen.

Ich habe es mal versucht aber es kam nichts in der Textdatei an.

Hier mein Versuch dein Script anzupassen:

param(
[string]$parameter1,
[string]$parameter2,
[string]$parameter3,
[string]$parameter4
)

[string]$filePath = 'C:\Users\Schorsch\Desktop\PS1Test.txt'

  1. funktion die prüft ob eine Datei durch einen anderen Prozess blockiert ist.
function check([string]$filePath){
try{
$fileStream = (New-Object System.IO.FileInfo $filePath).OpenWrite()
$fileStream.Close(); $fileStream.Dispose()
                                  1. file is not locked by another process
                                  return $true
                                  }catch{
                                                                  1. file is locked
                                                                  return $false
                                                                  }
                                                                  }

                                                                  1. Für den Fall das Datei locked ist wiederhole Zugriff alle 0,5 Sekunden
                                                                  while(!(check 'C:\Users\Schorsch\Desktop\PS1Test.txt')){
                                                                  sleep -Milliseconds 500
                                                                  }
                                                                  1. Als Beispiel Parameter1 in die Textdatei schreiben
                                                                  $parameter1 | set-content 'C:\Users\Schorsch\Desktop\PS1Test.txt'

                                                                  VG Schorsch
Mitglied: 114757
Solution 114757 Jun 14, 2015 updated at 20:45:41 (UTC)
Goto Top
Erstens, deine eingefügte Zeile kommt weg, die ist überflüssig, denn $filePath ist eine Variable die nur in der Function zum Einsatz kommt und diese wird der Funktion ja immer in der Schleife übergeben!:
[string]$filePath = 'C:\Users\Schorsch\Desktop\PS1Test.txt'  
Du kannst jedoch eine Variable für den Pfad verwenden, dann musst du aber diese auch unten anstatt der festen Pfad eingeben.

Zweitens, wie hast du das Powershell-File aufgerufen, und hast du überhaupt schon mal mit Powershell zu tun gehabt? Und wurde die Executionpolicy schon freigeschaltet ?

Aufgerufen wird das Script so aus einer CMD:
powershell -ExecutionPolicy Bypass -File "c:\Pfad\deinscript.ps1" "Parameter1"

Im Script wird ja als Beispiel nur der erste Parameter in eine Textdatei geschrieben. Das kann man ja dann nach Bedarf und gewünschtem Format anpassen.

Klappt einwandfrei !

Gruß jodel32
Member: Schorsch112
Schorsch112 Jun 14, 2015 at 20:48:40 (UTC)
Goto Top
Hallo jodel32,

das Problem sitzt wie immer vor dem PC face-sad

Dein Code hat mit sehr weiter geholfen und Du hattest recht; ich habe sonst noch nie etwas mit Powershell zu tun gehabt.
PROBLEM GELÖST face-smile

Die ExecutionPolicy hatte ich aber deaktiviert.

Kennst Du dich den auch mit den Commandline Befehlen aus? Kann man hierüber ggf. auch Parameter an eine Anwendung übergeben?

Nochmals vielen Dank für Deine Hilfe!!!!!

VG Schorsch
Mitglied: 114757
114757 Jun 14, 2015 updated at 21:50:22 (UTC)
Goto Top
Kennst Du dich den auch mit den Commandline Befehlen aus?
Spezifiziere das, eine "Commandline" ist für mich eine Kommandozeile, was soll das für ein Tool sein ??? noch nie davon gehört.
Wenn du mir dazu einen Link hättest kann man dir weiterhelfen !

Kann man hierüber ggf. auch Parameter an eine Anwendung übergeben?
s.o. dazu muss ich erst mal wissen was für ein Tool du überhaupt meinst und was du genau vorhast !