« IF ERRORLEVELの零判定 | トップページ | ファイル名に&を使うときは、半角空白も併せて使うべし。 »

2009年2月11日 (水)

ファイル名に=;,や全角空白を含むファイルをバッチファイルにドロップすると、ファイル名が分割される。(その4)

バッチファイル側、バッチファイル機能だけで対処します。

@echo off
setlocal enabledelayedexpansion
set cmdline=%*
set fq=
set fg=
set fb=true
set cmdline2=
set n=0
if not defined cmdline goto :next
:for
  set c=!cmdline:~%n%,1!
  if not defined c goto :next
  if defined fq (
    if !c!==^" set fq=& if defined fg set cmdline2=!cmdline2!^"
  ) else (
    if !c!==^  if not defined fb (
      set fb=true
      if defined fg (
        set fg=
        set cmdline2=!cmdline2!^"
      )
    )
    if not !c!==^  if defined fb (
      set fb=
      if not !c!==^" (
        set fg=true
        set cmdline2=!cmdline2!^"
      )
    )
    if !c!==^" set fq=true& if defined fg set cmdline2=!cmdline2!^"
  )
  set cmdline2=!cmdline2!!c!
  set /a n+=1
  goto :for
:next
if defined fq set cmdline2=!cmdline2!^"& if defined fg set cmdline2=!cmdline2!^"
if defined fg set cmdline2=!cmdline2!^"
call :main !cmdline2!
goto :eof
:main
rem 元のバッチファイルをここに置く
echo;%*

« IF ERRORLEVELの零判定 | トップページ | ファイル名に&を使うときは、半角空白も併せて使うべし。 »