Per BATCH Vorhandensein von Dateien (in Poser-Strukturen) abfragen, und bei fehlen anlegen, doch wie?
Ich schlage mich nun schon fast 20 Jahre mit Computern herum und treffe immer mal wieder auf Probleme, die ich nicht alleine lösen kann.
(Bei der Vorschau dieses Beitrages werde ich ständig ermahnt, keine Slash oder Backslash zu verwenden!? Ohne kann ich aber Pfadprobleme nicht erklären!)
Ich benutze das Programm Poser seit Version 3 und nun in Version 7. Für die, die es nicht kennen: der Name ist Programm! Es dient dazu Figuren in "Posen" zu setzen, oder zu animieren. es ist überwiegend Scriptbasiert um systemübergreifend benutzbare Dateien zu ermöglichen. Die all-konformen Pfadangaben in den Scripten ist etwa so: ":Runtime:libraries:pose:Ordnername:Filename.pz2" oder ":Runtime:Geometries:Ordnername:filename.obj" oder ":Runtime:Libraries:Character:Ordnername:Dateiname.cr2" oder ":Runtime:textures:texfoldername:texfilename.ext"
Damit sollte klar werden, der Pfadtrenner ist der *Doppelpunkt* und kein Slash oder Backslash. Poserdateien sind normalerweise Textdateien und enthalten solche Pfade (zu 3d-Objekten, Texturen, oder anderen Poser-Files.).
Pfadangaben in Windows-Schreibweise funktionieren zwar auch, aber AUSSCHLIESSLICH auf dem PC des Erstellers!!!
Pfadnamen wie: (Die Vorschau meckerte grade wegen unerlaubter Zeichen: Backslash: daher schreibe ich hier das Stück als CODE)sind möglich! ABER ÄRGERLICH! weil nicht austauschbar!
Ein wesentlicher Bestandteil der Arbeiten liegt in den sogenannten Pose-Files.pz2
Oft bekommt man von anderen solche Pose-Dateien mit hunderten Aufrufen von weiteren Dateien, sogenannten "Inject-Files" die neue Geometriepunkte einfügen als neue Morph-Ziele. Manchmal schlampern die Anbieter von Zubehör auch und statt z.B.:
wobei der Teil zwischen den spitzen Pfeilen stark variieren kann. Das Hauptproblem dabei: solche "Festen Pfade" funktionieren auf anderen Rechnern nicht und sorgen für stundenlange Wartezeiten, bei denen Poser wohl in China oder Antarktika, aber nicht auf der lokalen Festplatte diese Dateien zu suchen scheint. Jedenfalls dauert das Stunden und der Rechner wird nahezu lahm gelegt, solange die Suche nach Dateien läüft, die nicht im Standard-Pfad zu finden sind.
Problem 1:
Ich würde solche Dateien gern per BATCH von den "schlechten" Pfadangaben auf die "richtigen" (Mit :Doppelpunkt:Pfaden) ändern und alles vor ":Runtime:" entfernen lassen.
Problem 2:
oft werden in .pz2 Dateien andere "inj-yxz.pz2" Dateien geladen, die gar nicht mitgeliefert wurden.
Mitunter gibt es hundert(e) solcher Aufrufe.
Wenn einige davon fehlen, sucht sich Poser stundenlang tot danach und legt den PC in dieser Zeit fast lahm. Das kann im schlimmsten Falle einen ganzen Tag dauern.
Poser kann mehrere :Runtime:-Ordner verwalten, wenn diese in Poser eingebunden sind. Aber nach nicht vorhandenen Dateien in diesen Pfaden sucht es sich dämlich.
Daher suche ich eine Scriptvariante, die aus dem entsprechenden Pose-Ordner heraus im DOS-Modus diese Dateien untersucht und abfragt, ob die zu ladenden Dateien vorhanden sind. Sind sie es nicht, dann sollen Dummy-Dateien an deren Stelle angelegt werden, die ganz leer sein können, oder nur die Minimalinfos enthalten.
Minimalinfobeispiel:
Herauskommen soll also etwa sowas:
Also diese Zeilen mit "readScript" möchte ich untersuchen lassen. Delimeter wäre hier der Doppelpunkt, doch die Verschachtelungstiefe kann und wird unterschiedlich sein, so daß ein einfaches "nimm%~5" nicht immer funktionieren wird.
Die zu untersuchende Datei dieses Beispiels liegt in "Runtime:Libraries:Pose:NBS V3:" und heißt INJ-NBS.pz2
lädt aber Dateien aus "Runtime:Libraries:Posermatic-INJ:NBS_INJFiles:"
und dort fehlen einige.
Diese fehlenden möchte ich gerne als leere Dummys angelegt haben. Sie funktionieren zwar nicht wirklich in Poser, weil die Deltas und alle Einstellungen für die Morphtargets fehlen, aber Poser findet die Dateien und sucht sich nicht mehr tot.
(Das habe ich schon erfolgreich mit anderen Beispielen manuell gemacht. Dauert aber zu lange.)
Die einzige Konstante an diesen Pfaden ist ":Runtime:"! Alle anderen Pfade können leider je nach Gusto des Inhaltsanbieters stark variieren. Sie müssen nicht alle zwingend in "Runtime:Libraries:Pose:" liegen, und selbst wenn, können sie in weiteren beliebig verschachtelten Unterordnern sein.
Vorschläge für ARexx sind auch willkommen, aber Pearl oder PHP ist auf meinem PC nicht installiert.
Vielen Dank schon mal für Antworten.
Liebe Grüße Roschka
(Bei der Vorschau dieses Beitrages werde ich ständig ermahnt, keine Slash oder Backslash zu verwenden!? Ohne kann ich aber Pfadprobleme nicht erklären!)
Ich benutze das Programm Poser seit Version 3 und nun in Version 7. Für die, die es nicht kennen: der Name ist Programm! Es dient dazu Figuren in "Posen" zu setzen, oder zu animieren. es ist überwiegend Scriptbasiert um systemübergreifend benutzbare Dateien zu ermöglichen. Die all-konformen Pfadangaben in den Scripten ist etwa so: ":Runtime:libraries:pose:Ordnername:Filename.pz2" oder ":Runtime:Geometries:Ordnername:filename.obj" oder ":Runtime:Libraries:Character:Ordnername:Dateiname.cr2" oder ":Runtime:textures:texfoldername:texfilename.ext"
Damit sollte klar werden, der Pfadtrenner ist der *Doppelpunkt* und kein Slash oder Backslash. Poserdateien sind normalerweise Textdateien und enthalten solche Pfade (zu 3d-Objekten, Texturen, oder anderen Poser-Files.).
Pfadangaben in Windows-Schreibweise funktionieren zwar auch, aber AUSSCHLIESSLICH auf dem PC des Erstellers!!!
Pfadnamen wie: (Die Vorschau meckerte grade wegen unerlaubter Zeichen: Backslash: daher schreibe ich hier das Stück als CODE)
C:\Program files\Courious labs\Poser\Runtime
C:\Programme\Metacreations\Poser\Runtime
X:\kyrilLisch\anBieternAmeN\pOseR\runtime
Ein wesentlicher Bestandteil der Arbeiten liegt in den sogenannten Pose-Files.pz2
Oft bekommt man von anderen solche Pose-Dateien mit hunderten Aufrufen von weiteren Dateien, sogenannten "Inject-Files" die neue Geometriepunkte einfügen als neue Morph-Ziele. Manchmal schlampern die Anbieter von Zubehör auch und statt z.B.:
":Runtime:textures:texfoldername:texname.jpg"
steht in diesen Dateien
"<X:\Projects\myprivate\poserfilates>\runtime\textures\texfoldername\texname.jpg"
Problem 1:
Ich würde solche Dateien gern per BATCH von den "schlechten" Pfadangaben auf die "richtigen" (Mit :Doppelpunkt:Pfaden) ändern und alles vor ":Runtime:" entfernen lassen.
Problem 2:
oft werden in .pz2 Dateien andere "inj-yxz.pz2" Dateien geladen, die gar nicht mitgeliefert wurden.
Mitunter gibt es hundert(e) solcher Aufrufe.
Wenn einige davon fehlen, sucht sich Poser stundenlang tot danach und legt den PC in dieser Zeit fast lahm. Das kann im schlimmsten Falle einen ganzen Tag dauern.
Poser kann mehrere :Runtime:-Ordner verwalten, wenn diese in Poser eingebunden sind. Aber nach nicht vorhandenen Dateien in diesen Pfaden sucht es sich dämlich.
Daher suche ich eine Scriptvariante, die aus dem entsprechenden Pose-Ordner heraus im DOS-Modus diese Dateien untersucht und abfragt, ob die zu ladenden Dateien vorhanden sind. Sind sie es nicht, dann sollen Dummy-Dateien an deren Stelle angelegt werden, die ganz leer sein können, oder nur die Minimalinfos enthalten.
Minimalinfobeispiel:
{
version
{
number 4.01
}
}
Herauskommen soll also etwa sowas:
lies die Datei zeilenweise und suche nach sowas wie
readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8a-L-cH-chest.pz2"
if not exist filename.pz2 echo {version{number 4.01}} >filename.pz2 else echo Datei vorhanden, weiter mit nächster Zeile...
Also diese Zeilen mit "readScript" möchte ich untersuchen lassen. Delimeter wäre hier der Doppelpunkt, doch die Verschachtelungstiefe kann und wird unterschiedlich sein, so daß ein einfaches "nimm%~5" nicht immer funktionieren wird.
Die zu untersuchende Datei dieses Beispiels liegt in "Runtime:Libraries:Pose:NBS V3:" und heißt INJ-NBS.pz2
lädt aber Dateien aus "Runtime:Libraries:Posermatic-INJ:NBS_INJFiles:"
und dort fehlen einige.
Diese fehlenden möchte ich gerne als leere Dummys angelegt haben. Sie funktionieren zwar nicht wirklich in Poser, weil die Deltas und alle Einstellungen für die Morphtargets fehlen, aber Poser findet die Dateien und sucht sich nicht mehr tot.
(Das habe ich schon erfolgreich mit anderen Beispielen manuell gemacht. Dauert aber zu lange.)
Die einzige Konstante an diesen Pfaden ist ":Runtime:"! Alle anderen Pfade können leider je nach Gusto des Inhaltsanbieters stark variieren. Sie müssen nicht alle zwingend in "Runtime:Libraries:Pose:" liegen, und selbst wenn, können sie in weiteren beliebig verschachtelten Unterordnern sein.
Vorschläge für ARexx sind auch willkommen, aber Pearl oder PHP ist auf meinem PC nicht installiert.
Vielen Dank schon mal für Antworten.
Liebe Grüße Roschka
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 154474
Url: https://administrator.de/contentid/154474
Ausgedruckt am: 23.11.2024 um 09:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo Roschka!
Zu Problem1:
Wenn der Pfad einmal isoliert wurde (zum Testen schreibe ich ihn einfach in die Variable %POld% - das Leerzeichen in "tex foldername" ist übrigens Absicht, um auch diesen Aspekt getestet zu haben) sollte das so gehen:
Da die Pfade aber (lt Deinem Beispiel) kaum alleine in einer Zeile stehen dürften, solltest Du die Ausgangsdaten in dieser Hinsicht noch näher beschreiben (oder steht immer "readScript" vor einem solchen Pfad, und ist dieser immer von Anführungszeichen umgeben?) ...
Zu Problem2:
Nach dem Bereinigen der Schreibweise könnte das Ergänzen der Dateien dann so gehen:
wobei die "Minimal.txt" die von Dir oben beschriebenen Zeilen enthalten würde.
Beide Batchansätze befinden sich im Stadium "so gut wie ungetestet" ...
Grüße
bastla
Zu Problem1:
Wenn der Pfad einmal isoliert wurde (zum Testen schreibe ich ihn einfach in die Variable %POld% - das Leerzeichen in "tex foldername" ist übrigens Absicht, um auch diesen Aspekt getestet zu haben) sollte das so gehen:
@echo off & setlocal
set POld="X:\Projects\myprivate\poserfilates\Runtime\textures\tex foldername\texname.jpg"
call :MakePath %POld%
echo %PNew%
goto :eof
:MakePath
set "PNew=%~1"
set "PNew=%PNew:*runtime=%"
set "PNew=:runtime%PNew:\=:%"
goto :eof
Zu Problem2:
Nach dem Bereinigen der Schreibweise könnte das Ergänzen der Dateien dann so gehen:
@echo off & setlocal
set "Base=D:\Poser"
set "Source=D:\Poser\Runtime\Libraries\Pose\NBS V3"
pushd "%Source"
for /f "delims=" %%i in ('dir /b /a-d *.pz2') do for /f "tokens=1*" %%a in ('findstr /b "readScript" "%%i" do set "PRel=%%~j" & call :CheckAndMakeFile
goto :eof
:CheckAndMakeFile
set "PAbs=%Base%\%PRel::=\%"
if not exist "%PAbs%" copy D:\Minimal.txt "%PAbs%">nul
goto :eof
Beide Batchansätze befinden sich im Stadium "so gut wie ungetestet" ...
Grüße
bastla
Hallo Roschka!
Eigentlich müssten sich doch die zu bearbeitenden / zu prüfenden Zeilen mit einer Suche nach "runtime" identifizieren lassen, wobei der Pfad (unter Vewendung von Leerzeichen und/oder TAB als Trennzeichen) immer ab dem zweiten Teil der Zeile beginnt - wenn ja, könnte der Batch 2 so aussehen:
Natürlich lässt sich der Pfad (%Source%) in welchem sich die zu prüfenden Dateien befinden, auch als Aufrufparameter übergeben - dazu müsste nur die Zeile 3 durch
ersetzt werden.
Was das Korrigieren der Pfade angeht, sollten ja die gleichen Vorüberlegungen (Zeilen mit "runtime", Pfad nach dem ersten "Wort" der Zeile) gelten - falls ja, wird sich das auch per Batch machen lassen ...
Grüße
bastla
Eigentlich müssten sich doch die zu bearbeitenden / zu prüfenden Zeilen mit einer Suche nach "runtime" identifizieren lassen, wobei der Pfad (unter Vewendung von Leerzeichen und/oder TAB als Trennzeichen) immer ab dem zweiten Teil der Zeile beginnt - wenn ja, könnte der Batch 2 so aussehen:
@echo off & setlocal
set "Base=D:\Poser"
set "Source=D:\Poser\Runtime\Libraries\Pose\NBS V3"
set "Typ=*.pz2 *.cr2"
pushd "%Source"
for /f "delims=" %%i in ('dir /b /a-d %Typ%') do for /f "tokens=1*" %%a in ('findstr /b "runtime" "%%i") do set "PRel=%%~b" & call :CheckAndMakeFile
goto :eof
:CheckAndMakeFile
set "PAbs=%Base%\%PRel::=\%"
if not exist "%PAbs%" copy D:\Minimal.txt "%PAbs%">nul
goto :eof
set "Source=%~1"
Was das Korrigieren der Pfade angeht, sollten ja die gleichen Vorüberlegungen (Zeilen mit "runtime", Pfad nach dem ersten "Wort" der Zeile) gelten - falls ja, wird sich das auch per Batch machen lassen ...
Grüße
bastla
... obwohl sich, nicht zuletzt aus Gründen der Performance, eher ein VBScript anböte, zB:
Die Verarbeitung erfolgt so, dass jede Zeile, welche "runtime" enthält, am ersten Leerzeichen geteilt wird (vor der Aktion dürfen also nur TAB stehen) - der erste Teil wird als Variable "Action" zwischengespeichert und bei der Ausgabe unverändet übernommen, der zweite Teil wird als Pfad interpretiert, dessen von "runtime" liegender Teil entfernt und im Rest jeder "\" durch ":" ersetzt wird. Falls der Pfad unter Anführungszeichen stand (bzw exakter: mit Anführungszeichen endete), wird er neuerlich unter Anführungszeichen gesetzt. Bei der Augabe wird zwischen dem "Action"-Teil und dem neuen Pfad ein einzelnes Leerzeichen gesetzt.
Zum Testen dieses Scripts einfach eine Kopie (Achtungs: die Datei wird ohne Erstellung einer Sicherungskopie veändert) der zu verarbeitenden Datei auf die Scriptdatei (Typ ".vbs") ziehen und nach Ende des Scripts die übergebene Datei mit dem Original vergleichen ...
Wie bereits erwähnt wird beim Zerlegen der Zeile auf das erste Leerzeichen abgestellt - sollte sich dieses nicht eignen, da zB anstelle von TAB Leerzeichen für Einrückungen verwendet werden, wäre ein anderes Kriterium zum Trennen der Zeile erforderlich (etwa, indem am ersten Leerzeichen nach dem Vorkommen eines der Schlüsselwörter aus "textureMap, bumpMap, readScript oder figureResourceFile" getrennt wird) - diese Information fehlt mir aber derzeit noch.
Grüße
bastla
LookFor = "runtime"
Set fso = CreateObject("Scripting.FileSystemObject")
F = WScript.Arguments(0)
T = Split(fso.OpenTextFile(F).ReadAll, vbCrLf)
For i = 0 To UBound(T)
Line = T(i)
If InStr(1, Line, LookFor, vbTextCompare) > 0 Then
P = InStr(Line, " ")
If P > 0 Then
Action = Left(Line, P-1)
POld = Trim(Mid(Line, P))
PNew = ":" & Replace(Mid(POld, InStr(1, POld, LookFor, vbTextCompare)), "\", ":")
If Right(PNew, 1) = """" Then PNew = """" & PNew
T(i) = Action & " " & PNew
End If
End If
Next
fso.CreateTextFile(F).Write Join(T, vbCrLf)
WScript.Echo "Done"
Zum Testen dieses Scripts einfach eine Kopie (Achtungs: die Datei wird ohne Erstellung einer Sicherungskopie veändert) der zu verarbeitenden Datei auf die Scriptdatei (Typ ".vbs") ziehen und nach Ende des Scripts die übergebene Datei mit dem Original vergleichen ...
Wie bereits erwähnt wird beim Zerlegen der Zeile auf das erste Leerzeichen abgestellt - sollte sich dieses nicht eignen, da zB anstelle von TAB Leerzeichen für Einrückungen verwendet werden, wäre ein anderes Kriterium zum Trennen der Zeile erforderlich (etwa, indem am ersten Leerzeichen nach dem Vorkommen eines der Schlüsselwörter aus "textureMap, bumpMap, readScript oder figureResourceFile" getrennt wird) - diese Information fehlt mir aber derzeit noch.
Grüße
bastla
Hallo Roschka!
Die Batch-Variante setzte voraus, dass es bereits "korrigierte" Pfade gibt (wobei allerdings in Zeile 7 anstelle von "runtime" ":runtime" zu verwenden wäre und auch wegen der Groß-/Kleinschreibung dem "
Grüße
bastla
Die Batch-Variante setzte voraus, dass es bereits "korrigierte" Pfade gibt (wobei allerdings in Zeile 7 anstelle von "runtime" ":runtime" zu verwenden wäre und auch wegen der Groß-/Kleinschreibung dem "
findstr
" noch ein "/i" hinzugefügt werden sollte); außerdem könnte auch eine Anpassung des Pfades in Zeile 12 nötig sein ...Grüße
bastla
Hallo Roschka!
Zur Sicherheit (falls ein Ordner nicht existieren sollte) könntest Du noch die Zeile 14 auf
ändern.
Um dem "file not found" auf die Spur zu kommen, solltest Du noch in Zeile 1 anstelle von "
Eine VBS-Version werde ich im Fall des Falles noch nachreichen.
Grüße
bastla
P.S.:
Die "Groß- Kleinschreibung" sollte meines Erachtens nach hoffentlich für "findstring" nach möglichst egal sein.
Ist sie auch - allerdings braucht es noch den Parameter "/i", damit sowohl "runtime" als auch "Runtime" gefunden werden - Zeile 9 daher:for /f "delims=" %%i in ('dir /b /a-d %Typ%') do for /f "tokens=1*" %%a in ('findstr /i /b ":runtime" "%%i") do set "PRel=%%~b" & call :CheckAndMakeFile
Leider verstehe ich nicht ganz, welche "Anpassung des Pfades in Zeile 12" du meinen könntest.
Das bezog sich nur auf den Pfad "D:\" - wenn die "Minimal.pz2" bereits dort liegt, ist keine Änderung erforderlich.Zur Sicherheit (falls ein Ordner nicht existieren sollte) könntest Du noch die Zeile 14 auf
if not exist "%PAbs%" xcopy D:\Minimal.pz2 "%PAbs%*">nul
Um dem "file not found" auf die Spur zu kommen, solltest Du noch in Zeile 1 anstelle von "
echo off
" ein "echo on
" verwenden - es werden dann alle Befehle vor der Ausführung angezeigt.Eine VBS-Version werde ich im Fall des Falles noch nachreichen.
Grüße
bastla
P.S.:
Das funktioniert sogar so gut, daß ich bereit bin eine Sharewaregebühr von 5Euro zu bezahlen!
Freut mich und danke für das Angebot, aber ich hoffe, Du hast eine bessere Verwendung für die 5 Euro ...
[OT] Moin Roschka, moin bastla,
Diese bessere Verwendung könnte natürlich eine Currywurst Pommes-Schranke mit einem Becher Schwipp-Schwapp sein oder aber
... mein' ja nur.....
Biber
[/OT]
Zitat von @bastla:
Das funktioniert sogar so gut, daß ich bereit bin eine Sharewaregebühr von 5Euro zu bezahlen!
Freut mich und danke für das Angebot, aber ich hoffe, Du hast eine bessere Verwendung für die 5 Euro ...Diese bessere Verwendung könnte natürlich eine Currywurst Pommes-Schranke mit einem Becher Schwipp-Schwapp sein oder aber
Spenden per SMS
Der Betrag von 5 Euro wird zzgl. der Standard-SMS-Gebühr mit der nächsten Handyrechnung bezahlt, 4,83 Euro je SMS gehen direkt an die Organisation.
Folgende Hilfsorganisationen haben SMS-Spendendienste eingerichtet:
Aktion Deutschland Hilft
Das Kennwort HAITI als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Caritas International
Das Kennwort lautet CARITAS als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Deutsches Rotes Kreuz
Das Kennwort DRK als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Deutsche Welthungerhilfe
Das Kennwort SOFORT als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Diakonie Katastrophenhilfe
Das Kennwort BEBEN als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
HelpDirect e.V.
Das Kennwort HAITIHILFE als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Rotary
Das Kennwort ERDBEBEN als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
Unsere Kleinen Brüder und Schwestern e.V.
Das Kennwort KINDER IN HAITI als SMS an die Telefonnummer 8 11 90 führt zu einer Spende in Höhe von 5 Euro.
... mein' ja nur.....
Biber
[/OT]