{"record":{"id":"4420f22f4dfd0b20","repo":"pentaho/pentaho-kettle","slug":"execprocess-processempty","errorCode":null,"errorMessage":"ExecProcess.ProcessEmpty","messagePattern":"ExecProcess\\.ProcessEmpty","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/execprocess/ExecProcess.java","lineNumber":122,"sourceCode":"                BaseMessages.getString( PKG, \"ExecProcess.Exception.CouldnotFindField\", fieldName ) );\n            }\n          }\n        }\n      }\n    } // End If first\n\n    Object[] outputRow = RowDataUtil.allocateRowData( data.outputRowMeta.size() );\n    for ( int i = 0; i < data.NrPrevFields; i++ ) {\n      outputRow[i] = r[i];\n    }\n    // get process to execute\n    String processString = data.previousRowMeta.getString( r, data.indexOfProcess );\n\n    ProcessResult processResult = new ProcessResult();\n\n    try {\n      if ( Utils.isEmpty( processString ) ) {\n        throw new KettleException( BaseMessages.getString( PKG, \"ExecProcess.ProcessEmpty\" ) );\n      }\n\n      // execute and return result\n      if ( meta.isArgumentsInFields() ) {\n        List<String> cmdArray = new ArrayList<>();\n        cmdArray.add( processString );\n\n        for ( int i = 0; i < data.indexOfArguments.length; i++ ) {\n          // Runtime.exec will fail on null array elements\n          // Convert to an empty string if value is null\n          String argString = data.previousRowMeta.getString( r, data.indexOfArguments[i] );\n          cmdArray.add( Const.NVL( argString, \"\" ) );\n        }\n\n        execProcess( cmdArray.toArray( new String[0] ), processResult );\n      } else {\n        execProcess( processString, processResult );\n      }","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/execprocess/ExecProcess.java#L104-L140","documentation":"Message key ExecProcess.ProcessEmpty thrown in ExecProcess.processRow: the string taken from the configured process field is null/empty, so there is no command to execute and the step aborts row processing with this localized error.","triggerScenarios":"processRow, per row: data.previousRowMeta.getString(r, data.indexOfProcess) returns null or empty string for the current row (upstream produced blank value or null).","commonSituations":"Lookup/Stream Lookup returned null for the command field; a JavaScript/Calculator step left the field empty; source data rows contain blank command values; filter mistakenly passes empty rows through.","solutions":["Filter out rows with an empty command field before ExecProcess (Filter rows: field IS NOT NULL and <> '').","Provide a default value upstream (e.g. 'Value Mapper' or NVL-style logic).","Fix the upstream step that should populate the command field.","If empty commands are expected but harmless, route those rows to a dummy/ignore branch."],"exampleFix":"// before: empty commands reach the step\n// (no filtering upstream)\n// after: filter them in the transformation\n// Filter rows: [command] IS NOT NULL AND [command] <> ''  -> ExecProcess\n// else -> Dummy (do nothing)","handlingStrategy":"validation","validationCode":"// upstream filter before ExecProcess\n// Filter rows: [command] IS NOT NULL AND [command] <> ''","typeGuard":null,"tryCatchPattern":"try { trans.execute(); } catch (KettleException e) { if (e.getMessage().contains(\"ProcessEmpty\")) { /* add empty-value filtering upstream */ } }","preventionTips":["Filter null/empty command rows before the step","Provide default values for lookup-missed rows","Test with production-like data containing blanks"],"tags":["kettle","empty-value","process-execution","execprocess"],"backgroundTag":"empty-required-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}