Adam,
Je ne sais pas si cela correspond à votre scénario, mais j'ai eu un problème similaire il y a quelques années.Sur un serveur de fichiers, un nouveau répertoire était créé chaque jour et ce dossier contenait les fichiers de ce jour. Le problème était que le temps n'était pas cohérent. L'heure du nom du dossier (répertoire) était la date et l'heure d'arrivée du premier fichier pour ce jour. Par conséquent, l'heure précise n'était pas connue.
La commande JSL la plus simple consistait à utiliser dossiers = Fichiers dans le répertoire( "chemin") et n'utilisez pas la récurrence. Utilisez ensuite JSL pour rechercher le dossier commençant par ou contenant la date d'aujourd'hui.Cela a parfaitement fonctionné, cependant, le serveur avait des "bazillions" de dossiers et les performances étaient assez lentes.Je travaille avec un système d'exploitation Windows, j'ai donc utilisé Exécuter le programme avec le cmd.exe pour exécuter une commande dir personnalisée. Par exemple, cette commande MS Dir
répertoire /a:d /o:-dc:\temp\jsl*
renverrait tous les dossiers (/a:d tous les répertoires) répertoriés du plus récent au plus ancien (/o:-d date inverse de l'ordre) qui existent dans mon répertoire c:\temp dont le nom de dossier commence par jsl. Je pourrais donc utiliser la date du jour pour réduire la liste.
Pour mon problème de dossier "bazillion", la structure du nom de répertoire que je devais rechercher était comme 20180524*something_somethingelse. parce qu'il y avait des moments où une sauvegarde redémarrait la construction du dossier, j'obtenais parfois 2 et très rarement 3 valeurs dans ma liste. Mais parce que c'est dans l'ordre inverse, le premier élément de ma liste était le dossier cible.
Dans mon script, une fois que j'ai obtenu le dossier cible, j'utiliserais Files In Directory (), maintenant que j'avais le répertoire avec le temps spécifique, inconnu et variable, et traiter chaque fichier et créer un rapport, le tout à distance (par lots ).
Si vous êtes sur Mac, je ne peux que proposer la suggestion de Jim, qui est formidable. Pour chaque fichier, dans la liste renvoyée par Files inDirectory(), recherchez ceux qui contiennent la date du jour et s'il y en a plusieurs, obtenez la date de création et trouvez la plus récente.
Si vous utilisez Windows et que vous rencontrez un problème de performances, voici un script qui montre comment obtenir tous les dossiers de votre répertoire d'installation JMP.[Remarque pour quelque chose d'aussi simple que cet exemple, Files in Directory() est la meilleure solution.]
// Get the full path for the JMP Install Directory
jmpDir = Convert File Path( "$JMP_Home", Windows );
Show( jmpDir );
// Build the DOS "dir" command
// dir /-C /T:C /S "C:\Program Files\SAS\JMPPRO\13\Samples\Data\*.J*" > c:\temp\dirOut_rp.txt
// --- DOS requires quoted file paths if the path includes spaces Program Files has a space
//this has no output file and /b only the directory name is returned
cmd_txt ="\[/c dir /a:d /b /-c /o:-d "]\"
|| jmpDir //will replace it with the full path of your installed JMP directory
||"\[* ]\";
show(cmd_txt ); //see the log file
//results returned as text
rpobj = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd_txt)}),
ReadFunction("text")
);
show(rpobj);
if(length(rpobj) >0, dirList= words(rpobj,"\!N") );
show(dirList);
/*
{"ExcelProfiler", "imagemaps", "Tip of the Day", "Help", "Resources", "pptx",
"Flash", "Documentation", "tkext", "Scoring", "Samples", "Web", "Maps"}
*/
//____________________________________________________________________________________________
//alternate command to return information to a file
outDir = "c:\temp\dirOut_rp.txt";
cmd_txt ="\[/c dir /a:d /b /-c /o:-d "]\"
|| jmpDir //will replace it with the full path of your installed Sample Data directory
|| "\[*" > ]\"
|| outDir;
show(cmd_txt ); //see the log file
t0 = Today();
rpobj = RunProgram(Executable("CMD.EXE" ),
Options({Eval(cmd_txt)}),
ReadFunction("text")
);
//--- ReadFunction is reading statements from the OS, it reads until the program quits.
// This command suspends subsequent JSL until executable has completed the tasks.
//==== Show results=============================================================================
// A couple of "checks" that you may employ here if the file does not does not exist or if it is older than expected
If( !File Exists( outDir ) | (Creation Date( outDir ) - t0 > 10),
Caption( "There was a problem with the dir command, it did not run. Aborting..." );
Wait( 4 );
Caption( Remove );
Throw();
);
// Open the results file as text stored in column 1
dir_dt = Open(
outDir,
columns( Name( "Dir results" ) = Character ),
Import Settings(
End Of Line( CRLF ),
End Of Field( CRLF ), // ensures only 1 column
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 1 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
Labels( 0 ),
Data Starts( 1 ),
Lines To Read( All ),
Year Rule( "10-90" )
)
);
Vous n'avez pas indiqué comment spécifier le répertoire à partir duquel obtenir les fichiers, j'ai donc simplement utilisé Pick Directory().Je suppose que vous avez juste un dossier standard où aller, et dans ce cas, vous pouvez simplement contourner le Pick Directory() avec :
folder = "<YOUR folder="" path="">";</YOUR>
Jim,
Merci pour votre aide,
Je ne connais pas la fonction de sélection de répertoire, peut-elle s'exécuter sans invite ? mon script doit s'exécuter quotidiennement en arrière-plan sans implication de l'utilisateur
merci
Voici un script simple qui, je pense, vous donnera une idée de la façon de déterminer quel(s) fichier(s) répond(ent) à vos besoins
Names Default To Here( 1 );
folder = Pick Directory();
// Get all of the files in the folder
FileList = Files In Directory( folder );
// Create the known part of the files to look for
Header = Char( Day( Today() ) ) || "_" || Char( Month( Today() ) ) || "_" ||
Char( Year( Today() ) - 2000 ) || "_";
// Loop through the found files and eliminate all that do not
// match the pattern we are looking for
For( i = N Items( FileList ), i >= 1, i--,
If( Left( FileList, Length( Header ) ) != Header,
FileList = Remove( FileList, i, 1 )
)
);