Rules only work automatically on the inbox. If the email server is placing the messages in the spam folder on the server before it goes to your inbox, then the Mail Rules won't catch them.
You can run rules manually, but I think it applies all the rules to the selected messages. You can't tell it to only apply your spam-move rule. For the rule to work, it would have to be able to identify the messages in some way (e.g., "In Mailbox: Junk," possibly). Even though you select the messages and tell it to apply rules, your rule would still have to look at the message and say to itself, "that's a message I am supposed to handle."
There isn't a "Not Junk" action. Moving the message to the Inbox is the method to mark messages as Not Junk (but I don't know if a rule moving it would unmark it--If the server is moving, then Mail is not marking it). I'm not sure if that Move to Inbox would then trigger the automatic rules (I would hope Apple has prevented that sort of recursive behavior). However, if you have one of the required criteria being that the message is in Junk mailbox, it should not attempt to move it again.
The other possibility is the emails have x-Spam headers put there by an email exchange that the message has passed through on it's way to you. Mail would be moving those if you have the "Trust junk mail headers in messages" checkbox selected in the Junk Preferences in Mail.
Since it requires you to select everything in Junk and Apply Rules (shortcut), an AppleScript might make it possible to do everything with a single shortcut, but I'm not sure how to write that script.