Looking at 1. to render each strip into it's own folder we can make a list of each nla strip, here I store the mute setting to restore later and mute each strip as we go through.
Then loop through our list of strips and render the frame range of each one, by setting the render.filepath
here each strip can go into it's own folder.
To also achieve 2. you could look at the script in this answer and incorporate it into the rendering loop.
import bpy
output_dir = '//renders/'
scene = bpy.context.scene
# make a list of strips used in the NLA
# strips are found in -
# object.animation_data.nla_tracks[TrackName].strips[stripName]
nla_strips = []
for obj in scene.objects:
if obj.animation_data and obj.animation_data.nla_tracks:
for track in obj.animation_data.nla_tracks:
for strip in track.strips:
nla_strips.append((strip, strip.mute))
strip.mute = True
# save to restore later
orig_frame_start = scene.frame_start
orig_frame_end = scene.frame_end
orig_filepath = scene.render.filepath
# render each strip
for strip in nla_strips:
scene.render.filepath = output_dir + strip[0].name + '/'
scene.frame_start = strip[0].frame_start
scene.frame_end = strip[0].frame_end
strip[0].mute = False
bpy.ops.render.render(animation=True)
strip[0].mute = True
# restore changes we made
scene.frame_start = orig_frame_start
scene.frame_end = orig_frame_end
scene.render.filepath = orig_filepath
for strip in nla_strips:
strip[0].mute = strip[1]