fix windows batch argument probrem.

the `shift` command of cmd.exe is not shift `%*`.
and use delayed-expansion. immediate expansion cause many troubles of special-characters in arguments.
`!` is delayed-expansion literal. I understood `%ENV%` expanded before parse time. `!ENV!` after parse time, before run time.

```bat
>type test.bat
SET A=%1
if NOT "!A!" == "" echo "OK"

>test a"a

SET A=a"a
The syntax of the command is incorrect.
if NOT "a"a" == "" echo "OK"
```

```bat
SET A=%1
if NOT "!A!" == "" echo "OK"

>test a"a
SET A=a"a
if NOT "!A!" == "" echo "OK"
"OK"
```