Here are some things I quickly came up with but didn't test so do come back here if they don't work and you can't figure out how to make them work:
If you don't care about crates "teleporting instead of moving", here is a quick hack:
[ > Crate | Ice No Crate No Wall ] -> [ | > Crate Ice ]
If you do care about that teleport bit or if you don't want the "if there's no crate in front of me" clause because you want crates to push other things, I suggest creating 4 invisible objects that just say "continue left", "continue up" and so forth.
Up [ ContinueUp | Crate Ice ] -> [ | > Crate Ice ]
Left [ ContinueLeft | Crate Ice ] -> [ | > Crate Ice ]
Right [ ContinueRight | Crate Ice ] -> [ | > Crate Ice ]
Down [ ContinueDown | Crate Ice ] -> [ | > Crate Ice ]
[ ContinueUp ] -> [ ]
[ ContinueLeft ] -> [ ]
[ ContinueRight ] -> [ ]
[ ContinueDown ] -> [ ]
I think you should do the other code inside here and after you're done, finish with these lines:
[ up Crate ] -> [ up Crate ContinueUp ] again
[ left Crate ] -> [ left Crate ContinueLeft ] again[ right Crate ] -> [ right Crate ContinueRight ] again
[ down Crate ] -> [ down Crate ContinueDown ] again
The `again` tag will tell it to continue doing all the code again and again until it all boxes have stopped from moving and a huge plus of this method is that you can actually see the boxes moving in action instead of zooming straight to the end of the ice line, yay! (again, I didn't test this code)