Adamo,
Non sono sicuro che questo corrisponda al tuo scenario, ma ho avuto un problema simile alcuni anni fa.Su un file server, ogni giorno veniva creata una nuova directory e quella cartella conteneva i file per quel giorno. Il problema era che il tempo non era coerente. L'ora del nome della cartella (directory) era la data e l'ora in cui è arrivato il primo file per quel giorno. Quindi, l'ora specifica non era nota.
Il comando JSL più semplice era da usare cartelle = File nella directory ("percorso") e non usare la ricorsione. Quindi utilizzare JSL per cercare la cartella che inizia con o conteneva la data odierna.Ha funzionato perfettamente, tuttavia, il server aveva "miliardi" di cartelle e le prestazioni erano piuttosto lente.Lavoro con un sistema operativo Windows, quindi ho utilizzato Esegui programma con cmd.exe per eseguire un comando dir personalizzato. Ad esempio, questo comando MS Dir
dir /a:d /o:-dc:\temp\jsl*
restituirebbe tutte le cartelle (/a:d tutte le directory) elencate dalla più recente alla meno recente (/o:-d data inversa dell'ordine) che esistono nella mia directory c:\temp il cui nome della cartella inizia con jsl. Quindi potrei usare la data del giorno corrente per restringere l'elenco.
Per il mio problema con la cartella "bazillion", la struttura del nome della directory che dovevo cercare era come 20180524*something_somethingelse. poiché a volte un backup riavviava la creazione della cartella, a volte ottenevo 2 e molto raramente 3 valori nel mio elenco. Ma poiché è in ordine inverso, il primo elemento nel mio elenco era la cartella di destinazione.
Nel mio script, una volta ottenuta la cartella di destinazione, userei Files In Directory (), ora che avevo la directory con il tempo specifico, sconosciuto, variabile, ed elaboravo ogni file e creavo un report, tutto da remoto (in batch ).
Se utilizzi un Mac, posso solo offrire il suggerimento di Jim che è fantastico. Per ogni file, nell'elenco restituito da Files inDirectory() cerca quelli che contengono la data odierna e se più di uno, ottieni la data di creazione e trova quella più recente.
Se utilizzi Windows e hai a che fare con un problema di prestazioni, ecco uno script che mostra come ottenere tutte le cartelle nella directory di installazione di JMP.[Nota per qualcosa di semplice come questo esempio, Files in Directory() è la soluzione migliore.]
// 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" )
)
);
Non hai indicato come specificare da quale directory ottenere i file, quindi ho usato Pick Directory().Presumo che tu abbia solo una cartella standard in cui andare, e in tal caso puoi semplicemente ignorare Pick Directory () con:
folder = "<YOUR folder="" path="">";</YOUR>
Jim,
Grazie per l'aiuto,
Non conosco la funzione di selezione della directory, può essere eseguita senza prompt? il mio script dovrebbe essere eseguito quotidianamente in background senza alcun coinvolgimento dell'utente
Grazie
Ecco un semplice script che penso ti darà un'idea di come capire quali file soddisfano le tue esigenze
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 )
)
);