Initial commit
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
PRO Run_Batch_Task_Import
|
||||
|
||||
;===========================================================================
|
||||
; --- 用户配置区域 ---
|
||||
; 1. **数据根目录 (rootDir)**
|
||||
; 指定包含所有Task_开头文件夹的根目录路径。
|
||||
; !!! 重要: 路径末尾不要带斜杠,脚本会自动添加。
|
||||
; - 正确示例: 'C:\MyData\LuTan1' 或 '\\SERVER\Share\Data'
|
||||
|
||||
; 2. **处理数量 (numToProcess)**
|
||||
; 指定要处理的Task文件夹的最大数量。
|
||||
; - 如果设置为 0 或一个负数, 程序将处理所有找到的文件夹。
|
||||
|
||||
;===========================================================================
|
||||
temporary_directory = 'D:/Sarscape_IDL_Area'
|
||||
SARscape_Batch_Init,Temp_Directory=temporary_directory
|
||||
rootDir = 'K:/T2'
|
||||
numToProcess = 0
|
||||
;===========================================================================
|
||||
; --- 脚本执行区域 ---
|
||||
;===========================================================================
|
||||
pathSep = ''
|
||||
IF (!VERSION.OS_FAMILY EQ 'Windows') THEN pathSep = '\' ELSE pathSep = '/'
|
||||
e = ENVI(/HEADLESS)
|
||||
|
||||
IF rootDir EQ '' OR FILE_TEST(rootDir, /DIRECTORY) EQ 0 THEN BEGIN
|
||||
PRINT, '错误: "rootDir" 参数未设置或指定的目录不存在: ' + rootDir
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
PRINT, '=============================================='
|
||||
PRINT, '开始批量导入陆探一号数据...'
|
||||
PRINT, '扫描目录: ' + rootDir
|
||||
PRINT, '=============================================='
|
||||
|
||||
; 查找所有Task_开头的文件夹 - 使用兼容的方法
|
||||
PRINT, '正在扫描Task_开头的文件夹...'
|
||||
|
||||
; 兼容旧版本IDL的方法:先搜索所有匹配项,然后筛选出文件夹
|
||||
allItems = FILE_SEARCH(rootDir + pathSep + 'Task_*', COUNT=nTotal)
|
||||
taskFolders = []
|
||||
nTasks = 0
|
||||
|
||||
IF nTotal GT 0 THEN BEGIN
|
||||
FOR i = 0, nTotal - 1 DO BEGIN
|
||||
IF FILE_TEST(allItems[i], /DIRECTORY) THEN BEGIN
|
||||
taskFolders = [taskFolders, allItems[i]]
|
||||
nTasks = nTasks + 1
|
||||
ENDIF
|
||||
ENDFOR
|
||||
ENDIF
|
||||
|
||||
IF nTasks EQ 0 THEN BEGIN
|
||||
PRINT, '在指定目录下没有找到任何Task_开头的文件夹。'
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
PRINT, '共找到 ' + STRING(nTasks) + ' 个Task文件夹,准备开始处理...'
|
||||
PRINT, ''
|
||||
|
||||
processed_count = 0
|
||||
|
||||
; 使用标准的FOR循环替代FOREACH以确保兼容性
|
||||
FOR taskIndex = 0, nTasks - 1 DO BEGIN
|
||||
taskFolder = taskFolders[taskIndex]
|
||||
|
||||
IF (numToProcess GT 0) AND (processed_count GE numToProcess) THEN BEGIN
|
||||
PRINT, ''
|
||||
PRINT, '已达到指定的处理数量 (' + STRING(numToProcess) + '),程序终止。'
|
||||
BREAK
|
||||
ENDIF
|
||||
|
||||
taskName = FILE_BASENAME(taskFolder)
|
||||
PRINT, '=== 正在处理任务文件夹: ' + taskName + ' ==='
|
||||
|
||||
; 检查master和slave子文件夹
|
||||
masterDir = taskFolder + pathSep + 'master'
|
||||
slaveDir = taskFolder + pathSep + 'slave'
|
||||
|
||||
; 处理master文件夹
|
||||
IF FILE_TEST(masterDir, /DIRECTORY) THEN BEGIN
|
||||
PRINT, '--- 处理master文件夹 ---'
|
||||
processed_count = processed_count + Process_LuTan_Folder(masterDir, pathSep)
|
||||
ENDIF ELSE BEGIN
|
||||
PRINT, '警告: ' + taskName + ' 中未找到master文件夹'
|
||||
ENDELSE
|
||||
|
||||
; 处理slave文件夹
|
||||
IF FILE_TEST(slaveDir, /DIRECTORY) THEN BEGIN
|
||||
PRINT, '--- 处理slave文件夹 ---'
|
||||
processed_count = processed_count + Process_LuTan_Folder(slaveDir, pathSep)
|
||||
ENDIF ELSE BEGIN
|
||||
PRINT, '警告: ' + taskName + ' 中未找到slave文件夹'
|
||||
ENDELSE
|
||||
|
||||
PRINT, '完成处理任务文件夹: ' + taskName
|
||||
PRINT, ''
|
||||
ENDFOR
|
||||
|
||||
PRINT, '=============================================='
|
||||
PRINT, '所有任务已完成!'
|
||||
PRINT, '总共成功处理了 ' + STRING(processed_count) + ' 个数据文件夹。'
|
||||
PRINT, '=============================================='
|
||||
|
||||
END
|
||||
|
||||
; 处理单个陆探一号数据文件夹的子函数
|
||||
FUNCTION Process_LuTan_Folder, folderPath, pathSep
|
||||
COMPILE_OPT STRICTARR
|
||||
|
||||
baseName = FILE_BASENAME(folderPath)
|
||||
PRINT, '-> 正在检查文件夹: ' + baseName
|
||||
|
||||
; 直接使用master/slave文件夹作为输出目录,不再创建envi_import子目录
|
||||
outputDir = folderPath
|
||||
|
||||
; 检查是否已经处理过(通过检查是否存在.sml文件)
|
||||
check_sml_file = FILE_SEARCH(outputDir + pathSep + '*.sml', COUNT=sml_count)
|
||||
IF sml_count GT 0 THEN BEGIN
|
||||
PRINT, '-> 跳过: ' + baseName + ' 文件夹中已存在处理结果。'
|
||||
RETURN, 0
|
||||
ENDIF
|
||||
|
||||
; 查找元数据文件 - 查找文件夹中所有的.meta.xml文件
|
||||
metaFiles = FILE_SEARCH(folderPath + pathSep + '*.meta.xml', COUNT=nMetaFiles)
|
||||
|
||||
IF nMetaFiles EQ 0 THEN BEGIN
|
||||
PRINT, '-> 警告: 在文件夹 ' + baseName + ' 中未找到元数据文件(*.meta.xml),跳过。'
|
||||
RETURN, 0
|
||||
ENDIF
|
||||
|
||||
; 处理找到的元数据文件
|
||||
success_count = 0
|
||||
FOR i = 0, nMetaFiles - 1 DO BEGIN
|
||||
inputFile = metaFiles[i]
|
||||
metaFileName = FILE_BASENAME(inputFile)
|
||||
PRINT, '-> 准备导入: ' + metaFileName
|
||||
|
||||
; 执行导入任务
|
||||
oSB = obj_new('SARscapeBatch')
|
||||
task = ENVITask('SARsImportLuTan1')
|
||||
task.INPUT_FILE_LIST = [inputFile]
|
||||
task.ROOT_URI_FOR_OUTPUT = outputDir ; 直接输出到master/slave文件夹
|
||||
|
||||
CATCH, error_status
|
||||
IF error_status NE 0 THEN BEGIN
|
||||
PRINT, '-> 错误: 在处理 ' + metaFileName + ' 时发生严重错误。'
|
||||
PRINT, !ERROR_STATE.MSG
|
||||
CATCH, /CANCEL
|
||||
CONTINUE
|
||||
ENDIF
|
||||
|
||||
task.Execute
|
||||
CATCH, /CANCEL
|
||||
PRINT, '-> 成功: 数据已导入到 ' + baseName + ' 文件夹中。'
|
||||
success_count = success_count + 1
|
||||
ENDFOR
|
||||
|
||||
RETURN, success_count
|
||||
END
|
||||
Reference in New Issue
Block a user