ReNamer:Pascal Script:Reuse variable
If you want to store a variable to reuse the value later you can read here a few tips.
For examples you can store the last used path, folder or file name or parts of them. Also you may want to store an index number, or perhaps a list of the original file names. There are several techniques to store variable values, feel free to choose the one that suits you.
File Approach
First we take a look on the file approach.
We use simple plain text files to store the variable.
Utilized Function
The ReNamer PascalScript functions to write and read text files are:
<syntaxhighlight lang="pascal"> FileWriteContent( "FileName" , "Content" ); FileAppendContent( "FileName" , "Content" );
FileReadContent("FileName"); FileCountLines("FileName"); FileReadLine( "FileName" , LineNum ); </source>
For "FileName" you can just use a name without a path to store the file into the ReNamer folder.
Example:
<syntaxhighlight lang="pascal">
FileWriteContent( "FileName.txt" , "Content" );
FileWriteContent( ".\FileName.txt" , "Content" );
</source>
To use an full path to your ReNamer folder use the ReNamer PascalScript function "GetApplicationPath"
Example:
<syntaxhighlight lang="pascal">
FileWriteContent( WideExtractFilePath(GetApplicationPath) + "FileName.txt" , "Content" );
</source>
You can use your private temp (temporary) folder in your profile
by using the ReNamer PascalScript function "WideGetTempPath"
Example:
<syntaxhighlight lang="pascal">
FileWriteContent( WideGetTempPath + "FileName.txt" , "Content" );
</source>
Also you can access all system environment variables by using "WideGetEnvironmentVar"
Example:
<syntaxhighlight lang="pascal">
UserName := WideGetEnvironmentVar('USERNAME');
</source>
Script examples
Store one value to one dedicated file
First rule in rule list:
(GET stored variable 'LastFolder')
<syntaxhighlight lang="pascal">
var
LastFold:string;
begin
if(GetCurrentFileIndex=1)then if(WideFileExists(WideGetTempPath + 'den4b_LastFolder.txt')) then LastFold := FileReadContent(WideGetTempPath +'den4b_LastFolder.txt');
//check if it works: ShowMessage(LastFold);
end. </source>
Other rules here in between
-
-
-
Last rule in rule list:
(SET variable 'LastFolder' to stored for later reuse)
<syntaxhighlight lang="pascal">
var
ParentFold:string;
begin
if(GetCurrentFileIndex=GetTotalNumberOfFiles)then begin ParentFold := CalculateMetaTag(FilePath, 'File_FolderName'); FileWriteContent(WideGetTempPath + 'den4b_LastFolder.txt', ParentFold); end; //check if it works: ExecuteProgram('notepad ' + WideGetTempPath + 'den4b_LastFolder.txt',false);
end. </source>
Store more then one value into a common file
Note this approach is to cumbersome for real use.
Better use dedicated file for each var/value (see above).
We can also use FileAppendContent(); to add "NAME=VALUE" pairs to an single file
and a routine to read the lines of that common vars.txt.
Here just as proof of concept:
Last rule in rule list:
(add a line with "NAME=VALUE" pair)
FileAppendContent('den4b_vars.txt','LastFolder=' + ParentF + #13#10);
This 'den4b_vars.txt' could look now like:
LastIndex=10 LastString=Vacation 2013 LastFolder=Translits
Other rules here in between
-
-
-
To get the wanted value i would use a code like this:
First rule in rule list:
- read the vars.txt
- split into lines
- split line into 'name' and 'value'
- check if 'name' is a wanted var name, if yes get the value
<syntaxhighlight lang="pascal"> var
vars,v:string; Lines,CurrLine:TWideStringArray; i:integer;
begin
if(GetCurrentFileIndex=1)then begin if( WideFileExists('.\den4b_vars.txt') ) then begin vars := FileReadContent('.\den4b_vars.txt'); ShowMessage('complete content:'+#10+vars); Lines:= WideSplitString(vars, #13#10); if( length(Lines) > 0 ) then begin for i:=0 to length(Lines)-1 do begin CurrLine := WideSplitString(Lines[i],'='); v := CurrLine[0]; //ShowMessage(v); if ( WideCompareText( v, 'LastIndex' ) =0) then ShowMessage( v + ' has value ' + CurrLine[1] ); if ( WideCompareText( v, 'LastFolder' ) =0) then ShowMessage( v + ' has value ' + CurrLine[1] ); if ( WideCompareText( v, 'LastString' ) =0) then ShowMessage( v + ' has value ' + CurrLine[1] ); end; end; end; end;
end. </source>
Registry Approach
Not recommended !
Not recommended !
<syntaxhighlight lang="pascal">
var ECAreturn:string;
begin // Add your code here //Store/Write/Set: ExecuteProgram('reg add HKCU\Software\den4b /v TestName1 /t REG_SZ /d "Test value 1" /f', true); //Load/Read/Get: ExecConsoleApp('reg query HKCU\Software\den4b /v TestName1', ECAreturn); ShowMessage(ECAreturn); // Result: // // ! REG.EXE VERSION 3.0 // // HKEY_CURRENT_USER\Software\den4b // TestName1 REG_SZ Test value 1 // //>---more code needed here to extract the value "Test value 1"---<
end. </source>
Clipboard Approach
<syntaxhighlight lang="pascal"> var
vLastExtension, vCurrentExtension: WideString;
begin
// At start, load stored data //Load/Read/Get: vLastExtension := GetClipboardText; // Add here some error handling and cleanup code for vLastExtension //if Length(vLastExtension) > 4 then Exit; // // Add your code here and use content of var vLastExtension vCurrentExtension := WideExtractFileExt(FileName); if vCurrentExtension <> vLastExtension then ..... // // // // At the end store the wanted data //Store/Write/Set: SetClipboardText(vCurrentExtension);
end. </source>