IPS_CreateScript

Hallo,

ich habe ein problem mit der Funktion IPS_CreateScript(0) die Funktion wird soweit ohne Fehlermeldung ausgeführt.
Wenn ich allerdings anschließend in den Objektbaum gehe sehe ich das der Scriptname grün geschrieben ist und auch keinen Wert enthällt.

Sobald ich versuche das Script zu bearbeiten und anschließend zu speichern bekomme ich folgende Fehlermeldung „Cannot create file „C:\IP-Symcon\script“. Das System kann den angegebenenen Pfad nich finden“.

Was mache ich falsch?
Ich benutze IP-Symcon Version 2.20

Hallo,
es wird daran liegen, dass noch keine entsprechende Datei (*.ips.php) im Script-Ordner existiert.

ich habe mir mal eine Funktion geschrieben, die eine entsprechende Datei anlegt und auch gleich einen beliebigen Text in das Skript schreibt:

$ScriptNAME: Name, wie er in IPS angezeigt wird
$ParentID: ID der Kategorie, Instanz, etc. unter der das Skript angelegt werden soll
$ScriptTEXT: Inhalt des Skripts

function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
   global $IPS_SELF;
	$ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
	if ($ScriptID == 0){

	   $ScriptID = IPS_CreateScript(0);
	   IPS_SetName($ScriptID, $ScriptNAME);
	   IPS_SetParent($ScriptID, $ParentID);
	   IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
		$fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
		fwrite($fh, $ScriptTEXT);
		fclose($fh);
		$ScriptPath = $ScriptID.".ips.php"; 	//Skriptdatei
		IPS_SetScriptFile($ScriptID, $ScriptPath);
		IPS_SetHidden($ScriptID, true);
	   // echo "Die Skript-ID lautet: ". $ScriptID;
	}
}

Hi,

diese Probleme hatte ich auch, als ich für Helmut seine Schaltsteckdosen ein Installationsskript zusammen bastelte.

Der nachfolgende Skriptauszug, welcher als Basis ein zuvor gefüttertes Array verwendet, funktioniert und soll nur als Gerüst für die Vorgehensweise dienen:

for($i=0; $i < count($Scripteanlegen); $i++)                                                          // For Schleife einklingeln
   {
		$Scripteanlegen [$i][0] = IPS_CreateScript(0);                           								// neuen Script anlegen und ID merken
		IPS_SetName($Scripteanlegen [$i][0], $Scripteanlegen [$i][1].$Name.$Scripteanlegen [$i][3]);    // dem Skript den neuen, aussagekraeftigen, Namen verpassen
		IPS_SetParent($Scripteanlegen [$i][0], $ModID);                          								// den Skript im Hierarchiebaum richtig plazieren
		IPS_SetInfo($Scripteanlegen [$i][0], "$Info");                           								// Info zur Variable hinzufügen
		$Scripteanlegen [$i][4] = $Scripteanlegen [$i][0]. ".ips.php"; 											// Skriptdateinamen zusammenhäkeln
				$handle = fopen($Scripteanlegen [$i][4], "w");                         							// diesen Befehl findet man nicht im IPS Manual, da hilft nur das Suchen im PHP Handbuch
				fwrite( $handle,
				$InfoScriptePrefix.chr(13).chr(10).$Scripteanlegen [$i][2].chr(13).chr(10).chr(13).chr(10). $InfoScripteSuffix);
				fclose( $handle);
		IPS_SetScriptFile($Scripteanlegen [$i][0], $Scripteanlegen [$i][4]);                				// ohne das Zuweisen zur Datei lüppt dat nich
   }                                                          														// For Schleife beenden

Das Geheimnis ist das manuelle Erzeugen der Skriptdatei und der abschliessende Befehl IPS_SetScriptFile.

mfg

BerndJ

Vielen Dank,

für die schnelle Antwort, funktioniert wunderbar.

@hirschbrat,

Danke für die Funktion. Ist genau das was ich gesucht habe danke.

Gruß Nick

habe jetzt nur ein Problem versuche nach den erzeugen des Scripts den Script namen im Scripts ordner zu setzen. Da dieser mit einem Inculde Befehl in ein Externes Script muss.

<?
//sucht die ID des übergeordneten Objekts
$ParentID = IPS_GetObject($IPS_SELF);
$ParentID = $ParentID['ParentID'];


$VarID_RGBFader = 665544;



function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
   global $IPS_SELF;
    $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
    if ($ScriptID == 0){

       $ScriptID = IPS_CreateScript(0);
       IPS_SetName($ScriptID, $ScriptNAME);
       IPS_SetParent($ScriptID, $ParentID);
       IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
        $fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
        fwrite($fh, $ScriptTEXT);
        fclose($fh);
        $ScriptPath = $ScriptID.".ips.php";     //Skriptdatei
        IPS_SetScriptFile($ScriptID, $ScriptPath);
        IPS_SetHidden($ScriptID, true);
        // echo "Die Skript-ID lautet: ". $ScriptID;
        return $ScriptID;
    }
}
$ScriptNAME = 'variablenidsrgbsteuerung';
$ScriptID = CreateScriptByName($ScriptNAME,$ParentID,
	'<?

	define("chromo_id",  XXXXX /**/, true);         // ID der ChromoFlex Instanz
	define("dimmer",     '.$VarID_RGBFader.' /**/, true);         // ID der Variable DIMMER
	define("dimmer_prg", XXXXX /**/, true);         // ID der Variable DIMMER_PRG
	define("programm",   XXXXX /**/, true);         // ID der Variable PROGRAMM (Programm kommen von 1-18)
	define("rgbfader",	XXXXX /**/, true); ;  // ID der Variable RGB Steuerung mit dem HEXCOLOR Profil


	?>'
);
$ScriptPath = "variablenidsrgbsteuerung.php"; //Skriptdatei
IPS_SetScriptFile($ScriptID, $ScriptPath);
?>

Hier meine ersten Versuche. Script wird sauber angelegt Inhalt stimtt auch aber bekomme den namen nicht gesetzt.

Stehe da echt auf dem Schlauch.

Gruß Nick

Hallo,

habe folgendes Problem:

Parse error: syntax error, unexpected ‚SELF‘ (T_STRING) in [Scripte\Rolläden est\Script einrichten] on line 7

Das Script sieht so aus:

<?

$ScriptNAME = "Mein Script";
$ParentID = 32468;  /*[Scripte\Rolläden	est]*/;
$ScriptTEXT = '
<?
echo ("Das ist ein Text!".$_IPS['SELF']);
phpinfo();
?>';

CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT);


function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT)
{
   global $IPS_SELF;
    $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
    if ($ScriptID == 0){

       $ScriptID = IPS_CreateScript(0);
       IPS_SetName($ScriptID, $ScriptNAME);
       IPS_SetParent($ScriptID, $ParentID);
       IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
        $fh = fopen(IPS_GetKernelDir()."scripts\\".$ScriptID.".ips.php", 'w') or die("can't open file");
        fwrite($fh, $ScriptTEXT);
        fclose($fh);
        $ScriptPath = $ScriptID.".ips.php";     //Skriptdatei
        IPS_SetScriptFile($ScriptID, $ScriptPath);
        IPS_SetHidden($ScriptID, true);
       // echo "Die Skript-ID lautet: ". $ScriptID;
    }
}

?>

Ich scheitere an den ’ und " im einzufügenden Text. Gibt es dafür eine Lösung? Ich möchte den Scriptinhalt eines bestehenden Scriptes in ein neues dynamisch erzeugtes einfügen.

Ein Backslash könnte helfen vor den '… Siehe hier: PHP: Strings - Manual

paresy