Adán,
No estoy seguro de si esto coincide con su situación, pero tuve un problema similar hace unos años. En un servidor de archivos, se creó un nuevo directorio cada día, y esa carpeta contenía los archivos para ese día. El problema era que el tiempo no era consistente. La hora del nombre de la carpeta (directorio) fue la fecha y hora en que llegó el primer archivo para ese día. Por lo tanto, el tiempo específico no se conocía.
El comando JSL más simple fue usar carpetas = Archivos en el Directorio ("ruta") y no usar recurse. Luego use JSL para buscar la carpeta que comenzó con o que contenía la fecha de hoy. Eso funcionó perfectamente, sin embargo, el servidor tenía "bazillones" de carpetas y el rendimiento era bastante lento. Trabajo con un sistema operativo Windows, así que usé Ejecutar programa con el cmd.exe para ejecutar un comando dir personalizado. Por ejemplo, este comando MS Dir
dir / a: d / o: -dc: \ temp \ jsl *
devolvería todas las carpetas (/ a: d todos los directorios) enumeradas desde la más reciente a la más antigua (/ o: -d fecha inversa del pedido) que existen en mi directorio c: \ temp cuyo nombre de carpeta comienza con jsl. Así que podría usar la fecha del día actual para limitar la lista.
Para mi problema de carpeta "bazillion", la estructura de nombre de directorio que tenía que buscar era como 20180524 * something_somethingelse. porque había veces que una copia de seguridad reiniciaba la compilación de la carpeta, a veces obtenía 2 y muy rara vez 3 valores en mi lista. Pero debido a que es de orden inverso, el primer elemento de mi lista fue la carpeta de destino.
En mi script, una vez que obtuve la carpeta de destino, usaría Files In Directory (), ahora que tenía el directorio con el tiempo específico, desconocido, variable, y procesaba cada archivo y creaba un informe, todo de forma remota (en lotes ).
Si estás en una Mac, solo puedo ofrecerte la sugerencia de Jim, que es genial. Para cada archivo, en la lista devuelta por Archivos en el Directorio () busque los que contengan la fecha de hoy y, si hay más de uno, obtenga la fecha de creación y busque la más reciente.
Si está usando Windows, y si está lidiando con un problema de rendimiento, aquí hay una secuencia de comandos que muestra cómo obtener todas las carpetas en su directorio de instalación JMP. [Nota para algo tan simple como este ejemplo, Archivos en el Directorio () es la mejor solución.]
// 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" )
)
);
No indicaste cómo especificarías de qué directorio obtendrías los archivos, así que solo usé Pick Directory (). Supongo que solo tienes una carpeta estándar a la que ir, y en ese caso puedes omitir el Directorio de selección () con:
folder = "<YOUR folder="" path="">";</YOUR>
Jim
gracias por tu ayuda,
No conozco la función de selección de directorio, ¿se puede ejecutar sin aviso? Mi script debe ejecutarse diariamente en segundo plano, sin participación del usuario.
Gracias
Aquí hay un script simple que creo que le dará una idea de cómo averiguar qué archivos satisfacen sus necesidades
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 )
)
);