roschka
Goto Top

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)
C:\Program files\Courious labs\Poser\Runtime
C:\Programme\Metacreations\Poser\Runtime
X:\kyrilLisch\anBieternAmeN\pOseR\runtime
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.:
":Runtime:textures:texfoldername:texname.jpg"   
steht in diesen Dateien 
"<X:\Projects\myprivate\poserfilates>\runtime\textures\texfoldername\texname.jpg"  
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:
{
 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

Content-ID: 154474

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

Ausgedruckt am: 23.11.2024 um 09:11 Uhr

bastla
bastla 06.11.2010 um 00:47:00 Uhr
Goto Top
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:
@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
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:
@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
wobei die "Minimal.txt" die von Dir oben beschriebenen Zeilen enthalten würde.

Beide Batchansätze befinden sich im Stadium "so gut wie ungetestet" face-wink ...

Grüße
bastla
Roschka
Roschka 07.11.2010 um 12:17:58 Uhr
Goto Top
Hallo bastla,
danke für deine Antwort.
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?) ...

Gut hier mal ein komplettes Script, Dateiname: INJ-NBS.pz2
{
    Version
    {
        Number 4.01
    }
    //------------------------------------------------------------------------------
    //  Turn off Inverse Kinematics
    //------------------------------------------------------------------------------

    figure
    {
        inkyChain LeftLeg
           {
           off
           }
        inkyChain RightLeg
           {
           off
           }
        inkyChain LeftHand
           {
           off
           }
        inkyChain RightHand
           {
           off
           }
    }

    //------------------------------------------------------------------------------
    //  Call morph injection scripts
    //------------------------------------------------------------------------------

    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmPsh-Dw-1-Bt-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmPsh-Frnt-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmPsh-Frnt-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmPsh-Frnt-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmPsh-Frnt-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-Bth-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-1-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-2-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-2-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injArmpsh-Dw-2-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Dwn-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Dwn-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Dwn-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Dwn-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-L-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-L-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-L-RlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Left-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-R-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-R-LrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-R-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-R-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Up-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Up-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Up-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injBlge-Up-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injDwn-1-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injDwn-1-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injDwn-1-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-1a-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-2-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-2-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-2-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-3a-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-3a-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-3a-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-4-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-L-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-R-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6a-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6a-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6a-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-6a-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-L-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-R-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8a-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8a-L-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8a-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFFlat-8a-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1-L-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1-R-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-1R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-2-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-Up-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-Up-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-Up-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injFrnt-Up-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-1-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-2-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-2-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-2-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-2-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:injHng-2-LlC-lCollar.pz2"  
// Remark: hier kommen noch 200 weitere Zeilen...

    //------------------------------------------------------------------------------
    //  Call morph channel display - UNHIDE
    //------------------------------------------------------------------------------

    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmPsh-Dw-1-Bt-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmPsh-Frnt-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmPsh-Frnt-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmPsh-Frnt-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmPsh-Frnt-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-Bth-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-R-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-1-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-2-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-2-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showArmpsh-Dw-2-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Dwn-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Dwn-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Dwn-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Dwn-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-L-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-L-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-L-RlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Left-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-R-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-R-LrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-R-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-R-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Up-LcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Up-LlC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Up-RcH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showBlge-Up-RrC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showDwn-1-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showDwn-1-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showDwn-1-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-Bt-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-Bt-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-Bt-rC-rCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-L-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-L-lC-lCollar.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-R-cH-chest.pz2"  
    readScript ":Runtime:libraries:Posermatic-INJ:NBS_INJFiles:showFFlat-1a-R-rC-rCollar.pz2"  
// Remark: hier sind das ebenfalls rund 250 Zeilen...
// An dieser Stelle kann so ein Scrip6t zu Ende sein, oder mit weiteren Einstellungen weiter gehen, die ich nicht alle hier rein kopiere

    //------------------------------------------------------------------------------
    //  Set Morph Target Dial Values
    //------------------------------------------------------------------------------

actor BODY:1
	{
	channels
		{
		targetGeom MIC_01
			{
			initValue 0.0000000
			keys
				{
				static 0
				k  0  0.0000000
				}
			}
		targetGeom MIC_02
			{
			initValue 0.0000000
			keys
				{
				static 0
				k  0  0.0000000
				}
			}
// hier habe ich ettliche ähnliche weggeschnitten
		targetGeom MIC_69
			{
			initValue 0.0000000
			keys
				{
				static 0
				k  0  0.0000000
				}
			}
		targetGeom MIC_70
			{
			initValue 0.0000000
			keys
				{
				static 0
				k  0  0.0000000
				}
			}
		targetGeom MIC_71
			{
			initValue 0.0000000
			keys
				{
				static 0
				k  0  0.0000000
				}
			}
		}
	}
actor chest:1
// hier kämen ebenfalls solche targetGeom-Einstellungen, und das für jeden betroffenen Körperteil.
// ich lasse den Rest mal weg. Das Ende der Datei:
    //------------------------------------------------------------------------------
    //  Thanks for buying from Posermatic store. Enjoy!
    //------------------------------------------------------------------------------
}

// WICHTIG in solchen Dateien: jede geöffnete Klammer { muß mit dem Gegenstück } an der richtigen Stelle bzw. am Ende wieder geschlossen werden, sonst sind die Dateien "ungültig" für Poser. Sie markieren die Element-Hierachie-Ebenen. Ob die Einrückungen mit TabStops oder Leerzeichen gemacht werden spielt keine Rolle, dient nur der besseren Lesbarkeit für Menschen.
Doch normalerweise, wenn alles funktioniert, sollte man sich als Anwender von Poser nicht mit den Quelltexten herumärgern müssen. Man wählt sie aus einer Bibliotheksleiste aus, wo sie ein Vorschaubild haben. Alle Poserdateien sind solche Textdateien mit eigentlich der gleichen Grundstruktur. Aber nicht jede Datei enthält alle Strukturen, außer den Szene-Dateien.pz3 Da ist alles drin. von der kompletten Figur, mit oder ohne Morphziele, ihrer Kleidung, weitere Gegenstände, Lichter, Kamera und Umgebungseinstellungen. Nur die Geometrie-Objekte und Texturen werden per Pfadangaben eingebunden.
Für "Spezialaufgaben" oder den Fall, daß man die Dateien weitergeben will, ist gelegentlich jedoch notwending die Dateien von Hand in einem Editor zu bearbeiten. Poser neigt unter Windows dazu, Windowspfade in die Dateien zu schreiben. Statt z.B.
figureResFile :Runtime:Geometries:DAZPeople:blMilWom_v3.obj
steht dann da
figureResFile D:\Programme\Poser 5\Runtime\Geometries\DAZPeople\blMilWom_v3.obj
Mit dem oberen Pfad wird die Datei auf jedem Rechner, auch Mac, gefunden.
Im unteren Beispiel nur auf dem PC des Erstellers. Da alle Pfadteile vor Runtime extrem unterschiedlich sein können.

Die menschlichen Figuren bestehen aus rund 80 hierachichen Körperteilen, da jeder Finger z.B. aus drei Teilen besteht. Über eine Bones genannte Hierachie werden diese körperteile zusammengehalten und animiert.
BODY
hip
abdomen
chest
neck
head
lCollar
lShldr
lForeArm
lHand
l(alle Fingerglieder)
lButtock
lTight
lShin
lFoot
... usw.
Ausschnitt aus einer Figurendatei "Character.cr2"
{

version
	{
	number 4.01
	}
figureResFile :Runtime:Geometries:DAZPeople:blMilWom_v3.obj
actor BODY:1
	{

	}
actor hip:1
	{
	storageOffset 0 0 0
	geomHandlerGeom 13 hip  
	}
actor abdomen:1
	{
	storageOffset 0 0 0
	geomHandlerGeom 13 abdomen  
	}
actor chest:1
	{
	storageOffset 0 0 0
	geomHandlerGeom 13 chest  
	}
// dann werden die restlichen aufgezählt
// danach wird nochmal das Objekt eingebunden und die eigentlichen Einstellungen kommen
figureResFile :Runtime:Geometries:DAZPeople:blMilWom_v3.obj

actor BODY:1
	{
	name    GetStringRes(1024,1)
	off
	bend 1
	dynamicsLock		1
	hidden		0
	addToMenu	1
	castsShadow		1
	includeInDepthCue		1
	parent UNIVERSE
	channels
		{
		targetGeom MIC_01
			{
			name -
			initValue 0
			hidden 1
			forceLimits 4
			Min -10000
			Max 10000
			trackingScale 0.02
			Keys
				{
				static  0
				k  0  0
				}
			}
// hier können hunderte Channels stehen...
			}
		}
	endPoint 0 0.74 0.25
	origin 0 0 0
	orientation 0 0 0
	displayOrigin		0
	displayMode USEPARENT
	customMaterial	0
	locked 0
	}

actor hip:1
	{
	name    GetStringRes(1024,6)
	on
	bend 1
	dynamicsLock		1
	hidden		0
	addToMenu	1
	castsShadow		1
	includeInDepthCue		1
	parent BODY:1
	channels
		{
		targetGeom PBMHipNarrow
			{
			hidden 1
			}
// auch hier können sehr viele Channels folgen. Das obere Morphziel ist leer und darum versteckt.
		}
		translateZ ztran
			{
			name GetStringRes(1028,14)
			initValue 0
			hidden 0
			forceLimits 0
			min -100000
			max 100000
			trackingScale 0.001
			keys
				{
				static  0
				k  0  0
				}
			interpStyleLocked 0
			}
		}
	endPoint -0.000976355 0.439941 -0.00563557
	origin 0 0.393 -0.005
	orientation -0.77246 0.00799924 1.18669
	displayOrigin		0
	displayMode USEPARENT
	customMaterial	0
	locked 0
	}

actor abdomen:1
// ... Am Ende kommt dann der Teil mit den Verkettungen und die Materialdefinitionen
figure 
	{
	name    Figure 1
	root    BODY:1
	addChild    hip:1 
			 BODY:1
	addChild    abdomen:1 
			 hip:1
	addChild    chest:1 
			 abdomen:1
	addChild    neck:1 
			 chest:1
	addChild    head:1 
			 neck:1
	addChild    leftEye:1 
			 head:1
	addChild    rightEye:1 
			 head:1
// usw.
	material SkinTorso
		{
		KdColor 1 0.768627 0.713725 1 
		KaColor 0 0 0 1 
		KsColor 0.019608 0.019608 0.019608 1 
		TextureColor 1 1 1 1 
		NsExponent 30 
		tMin 0 
		tMax 0 
		tExpo 0.6 
		bumpStrength 0.75 
		ksIgnoreTexture 0 
		reflectThruLights 1 
		reflectThruKd 0 
		textureMap ":Runtime:textures:subfolder:name_body.jpg"  
		bumpMap NO_MAP
		reflectionMap NO_MAP
		transparencyMap NO_MAP
		ReflectionColor 1 1 1 1 
		reflectionStrength 1 
		}
// .usw....

Bei Problem 1 geht es also darum Die Pfadangaben zu korrigieren, egal was davor steht, ob textureMap, bumpMap, readScript oder figureResourceFile.
Ideal wäre aber, wenn nicht der Name einer konkreten Poserdatei IM Batch geschrieben steht, sondern im fertigen Zustand die Batchdatei mit Parameterübergabe aus dem Poser-Ordner zu starten sei. Etwa mit "checkpathnames.bat *.pz2" der ganze Runtime-Baum durchforstet wird.
Da in den Dateinamen auch Leerzeichen vorkommen und besonders ärgerlich auch Ausrufezeichen, kann es sein, daß es besser funktioniert, wenn die Platzhalter *.cr2 *.pz2 doch in der Batch stehen.

Problem 2 kommt seltener vor. Im konkreten Falle stehen in dem Ordner :NBS_Injection: fast tausend Dateien und schätzungsweise um die 50 fehlen noch. Un dieses Fehlen führt dazu, daß Poser nicht nur stundenlang, sondern auch mal Tagelang nach den Dateien sucht und etwa alle halben Stunden nach einem nicht gefundenen Dateinamen mit Auswahlfenster fragt. In dieser Zeit ist Poser unbenutzbar und der PC hat 100% Prozessorlast. Ist also auch lahm.

Das mit dem "readScript " wird eigentlich nur gemacht, wenn eine größere Anzahl an Posen-Dateien auf einmal einzulesen sind und man lange klicken müßte, jede einzeln zu laden. Meist dient es dazu die Geometriedaten der Morphziele zu laden, in eine Figur, deren Morphziele noch leer sind..
Morphziele dienen dazu die Form der Gründgeometrie zu ändern, seien es Muskulaturbewegungen oder Gesichtszüge.
Da man die meisten Morphziele nicht jedesmal braucht, stehen sie nicht schon alle gleich in der Figurendatei "character.cr2" drin, sondern werden bei Bedarf über die Posedateien.pz2 nachgeladen. Denn jedes Morphziel braucht auch Speicherplatz, sowohl im RAM als auch in der Datei. Eine "fast leere" Victoria3.cr2 kann nur 1,5 MB "klein" sein. Mit "eingebauten" Morphchannels schon fast 8 MB, mit allen 268 Morphs von Hersteller DAZ kann sie aber schon mal fast 100 MB groß auf der Festplatte werden. Dabei ist sie noch "nackt" und hat weder Haare noch Kleidung. Auch die Texturen für fotorealistisches Hautaussehen können noch viele MB verschlingen. ;) Je nach Auflösung der Texturen.
Über die Posen-Dateien.pz2 können auch Materialdefinitionen oder Körperhaltungen oder ganze Bewegungsabläufe geladen werden.

Grüße
Roschka
bastla
bastla 07.11.2010 um 18:40:42 Uhr
Goto Top
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:
@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
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
set "Source=%~1"
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
bastla
bastla 07.11.2010 um 20:46:34 Uhr
Goto Top
... obwohl sich, nicht zuletzt aus Gründen der Performance, eher ein VBScript anböte, zB:
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"  
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
Roschka
Roschka 09.11.2010 um 01:44:04 Uhr
Goto Top
Hallo bastla,

habe recht vielen Dank für deine Antworten. Das VBS funktioniert!!!

Ob die Problemlösung nun mit MS-DOS-BATCH oder VBS erledigt wird, ist mir eigentlich egal. Hauptsache es funktioniert!
Da diese Problemstellung nicht erst seit "gestern" besteht, sondern schon seit Jahren, hatte ich jetzt echt zu tun noch Dateien zu finden, die nicht schon manuell geändert waren!
Die Windows-Suchfunktion ist leider ziemlich miserabel. Sie findet zwar alle "*.pz3" in irgendeinem Laufwerk, aber wenn man angibt "enthaltener Text: \Runtime\" oder enthaltener Text ":Runtime:", dann findet die gar nix!?!?!? Nicht mal die vorher als "*.pz3" erkannten?!?=!?!?
Es sieht also so aus, als müßte ich erst mal eine Datei gezielt "präparieren" um dein VBS drüber zu schicken. Denn so auf "die Schnelle" finde ich kein fehlerhaftes Poser-File mehr, weil ich viele schon manuell korrigierte.

In den Szene-Dateien.pz3 von Poser stellte ich fest, daß Poser die Pfade gegebenenfalls als ":downloads:Victoria3:Runtime:textures:irgendwas:skinname.jpg" speicherte; was eigentlich auch korrekt ist.
Ausgangsordner ist immer der, in dem das Poser.exe-Programm installiert ist!
Im Poser-Programm-Ordner gibt es "Runtime" und "downloads:runtime". Aber man kann darin für jede "Hauptfigur" einen weiteren Ordner anlegen. So ala ":downloads:Victoria4:runtime:"; "downloads:victoria2:runtime:"; ":downloads:animals:runtime:" usw. Dann speichert Poser diese PZ3 (Poser-Szenen) auch mit Doppelpunkt-Pfaden und findet alles wieder. = OK.
In diesen zusätzlichen Ordnern muß nur neben "Runtime" eine Dummydatei liegen, die leer ist und poser.exe heißt. Dann finden auch die Installations-Programme von Zusatzinhalt diese Ordner. (Auf Grund der großen Menge von Zusatz-Inhalten ist es sinnvoll, für jede Hauptfigur einen separaten Runtime-Ordner anzulegen!)
Doch bei den Posendateien scheint poser.exe nicht immer Doppelpunkt-Pfade zu schreiben. Ich bekam vor längerer zeit öfter Dateien in !"irgendwas\runtime\" schreibweise, wobei der Programme-Ordner mal spanisch, italienisch, englisch, norwegisch, oder sonstwas sein konnte; und so blöderweise in den Posendateien.pz2 stand. (Poser wechselte den Herausgeber öfters in seiner Geschichte)
z.B.: "C:\program files\Courious Labs\poser 4\runtime\" oder F:\Programme\MetaCreations\Poser 5\Runtime\". oder "X:\programe filates\EliteFrontier\poser6\Runtime\". Von daher meine ich, alles VOR "Runtime" ist unwichtig!
damit es funktioniert. Der ordner "Runtime" liegt aber immer neben poser.exe!

Alle Posen.pz2 Dateien funktionieren prinzipiell in jeder Poser-Version, so lange die sich an die Pfadkonventionen halten. es kann nur passieren, daß poser 4 oder 5 meint, die Datei sei für eine "neuere Version" geschrieben. egal, dann versteht es "nur" die neueren mathematischen Material-Definitionen (Shadertrees) nicht. Den "Rest" aber schon.

Ich präparierte daher ein beliebiges Script.pz2 mit "falschen" Pfadangaben als
textureMap "Q:\MetaCreations\Poser\Downloads\Victoria3\Runtime\textures\! Bices Jean\jean_body.jpg"
und speicherte es unter neuem Namen.
Dann zog ich das präparierte Script auf dein VBS und Klack, kurz danach kam ein kleines Fenster, darin stand nur "done".
Dann öffnete ich das präparierte Script wieder mit dem Windows-Editor und siehe da: jetzt steht da:
textureMap ":Runtime:textures:! Bices Jean:jean_body.jpg"

Also genau das was ich will! Super! Es funktioniert!!!
Habe recht vielen Dank dafür, bastla!

Aus Neugier probierte ich auch die Batch-Variante. Ich speicherte sie als checkexists.bat in
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3
aber etwas abgeändert an meine Pfade angepaßt. die Datei D:\minimal.pz2 legte ich extra mit an.
(minimal.pz2)
 {
	version
		{
		number 4.01
		}
// diese Datei fehlt leider, weil das Archiv kaputt oder unvollständig ist.
}
und die batch "checkexists.bat"
@echo off & setlocal
set "Base=Q:\MetaCreations\Poser"  
set "Source=Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3\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.pz2 "%PAbs%">nul  
goto :eof

im Dosfenster bekam ich jedoch die Meldung:
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>checkexis
ts.bat
Das System kann den angegebenen Pfad nicht finden.
Datei nicht gefunden

Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>


Viele Grüße Roschka.
bastla
bastla 09.11.2010 um 12:28:50 Uhr
Goto Top
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 "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
Roschka
Roschka 12.11.2010 um 02:16:32 Uhr
Goto Top
Hallo bastla,
ich habe versucht deine Vorschläge umzusetzen. Leider verstehe ich nicht alles. Die "Groß- Kleinschreibung" sollte meines Erachtens nach hoffentlich für "findstring" nach möglichst egal sein.
Leider verstehe ich nicht ganz, welche "Anpassung des Pfades in Zeile 12" du meinen könntest.
Hier die Anpassung, die ich machte, die aber leider nicht funktioniert, meint, die Fehlermeldung bleibt: "Datei nicht gefunden".
@echo off & setlocal
set "Base=Q:\MetaCreations\Poser"  
set "Source=Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3\Runtime\Libraries\Pose\NBS V3"  
set "Typ=*.pz2 *.cr2"  

rem 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 ...  

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.pz2 "%PAbs%">nul  
goto :eof
Leider hat sich nach den vorgeschlagenen Änderungen nichts gebessert. Die Fehlermeldung "file not found" bleibt.

Die Datei D:\Minimal.pz2 habe ich angelegt und die Syntax mit CR2-Editor überprüft. Ein Kommentar mit // beginnend darf nicht in der ersten Zeile stehen. Scheinbar korrekt zu funktionieren als Dummy für fehlende Dateien tut folgende D:\Minimal.pz2:
{
	version
		{
		number 4.01
		}
// diese Datei fehlt leider, weil das Archiv, bzw. die Installation, kaputt oder unvollständig ist.
}
wobei natürlich klar sein muß, das diese Datei in Poser selber gar nix nützliches machen kann. Sie ist einfach nur ein Dummy, der das "Totsuchen" nach fehlenden Dateien von Poser verhindern soll!!!

Auch wenn ich selber für VBSript so gut wie gar keine Ahnung habe, bin ich gern bereit funktionierende Vorschläge in VBS zu verwenden. Denn der Vorschlag von dem VBS vom 7.10. von bastla, funktioniert auch ohne daß ich alles verstanden habe!!! =Klick and drop. Super!
Das funktioniert sogar so gut, daß ich bereit bin eine Sharewaregebühr von 5Euro zu bezahlen! Denn gute Arbeit verdient eine angemessene Bezahlung!
bastla
bastla 12.11.2010 um 02:53:49 Uhr
Goto Top
Hallo Roschka!
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
ändern.

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 face-smile und danke für das Angebot, aber ich hoffe, Du hast eine bessere Verwendung für die 5 Euro ...
Biber
Biber 12.11.2010 um 07:55:17 Uhr
Goto Top
[OT] Moin Roschka, moin bastla,

Zitat von @bastla:
Das funktioniert sogar so gut, daß ich bereit bin eine Sharewaregebühr von 5Euro zu bezahlen!
Freut mich face-smile 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]
bastla
bastla 12.11.2010 um 12:23:12 Uhr
Goto Top
[OT]
@Biber
Ganz in meinem Sinn - danke face-smile

Grüße
bastla
[/OT]
Roschka
Roschka 14.11.2010 um 17:31:22 Uhr
Goto Top
Zitat von @bastla:
Hallo Roschka!
> Die "Groß- Kleinschreibung" ...
Ist sie auch - allerdings braucht es noch den Parameter "/i", damit sowohl "runtime" als auch
"Runtime" gefunden werden - ...
gut habe ich heute reingeschrieben.
> 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.
Ich habe die für den Zweck dort erst mal angelegt. Kann das aber später auch anpassen.

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.
OK, ECHO ON und BATCH aus dem im Beispiel ersichtlichen Pfad gestartet:
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>checkexists.bat
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>set "Base=Q:\MetaCreations\Poser"  
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>set "Source=Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3\Runtime\Libraries\Pose\NBS V3"  
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>set "Typ=*.pz2 *.cr2"  
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>pushd "Source"  
Das System kann den angegebenen Pfad nicht finden.
Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~b" & call :CheckAndMakeFile  
Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig sind.
"♥" ist syntaktisch an dieser Stelle nicht verarbeitbar.  
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>for /f "delims=" %i in ('dir /s /b /a-d *.pz2 *.cr2') do for /f "tokens=1*" %a in ('findstr /b ":runtime" "%i") do set "PRel=" & call :CheckAndMakeFile  

Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3>
so das ist die Ausgabe (noch ohne /i, aber für dir noch /S hinzugefügt, wegen der Unterordner)
Unklar ist mir grade ob in einer BATCH nun %%i oder nur %i stehen sollte. Habe beides ausprobiert, aber keine Variante ging.

Mir fällt aber grade noch ein, daß ja die Posendatei mit den Injectionzeilen "readScript ":Runtime:usw." untersucht werden sollte. Die heißt ja NBS-INJ.pz2 und liegt in dem kompletten Pfad:
Q:\MetaCreations\Poser\Downloads\Posermatic - Natural Breast System-V3\Runtime\Libraries\Pose\NBS V3\NBS-INJ.pz2
Ich habe das jetzt mal noch in der Zeile mit "set Source=" ergänzt um den Dateinamen probiert. Das geht aber leider auch nicht.
Die Fehlermeldungen bleiben die gleichen.

Eine VBS-Version werde ich im Fall des Falles noch nachreichen.
Das wäre toll!

Grüße
Roschka
bastla
bastla 14.11.2010 um 19:27:09 Uhr
Goto Top
Hallo Roschka!

Vorweg könntest Du noch die von mir konsequent fehlerhaft face-sad verwendete Zeile 9 durch
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
richtig stellen ...

Grüße
bastla