新しい記事書きました
追記
外部batにしました
使い方
%*
を渡すと、変数__ARGS
に格納されます
call fullspace_loader.bat %*
for %%i in (%__ARGS%) do echo %%~dpnxtzi
pause
fullspace_loader.bat
@echo off
setlocal
for %%i in (%*) do if not exist %%i goto :__ARRANGE_MODE
set __ARGS=%*
goto :__END
:__ARRANGE_MODE
for %%i in (%*) do call :__MERGE_ALL %%i
set __ARGS=%__ARGS:~1%
set __ARGS="%__ARGS:?=" "%"
goto :__END
:__MERGE_ALL
set __V=%~1
if "%__V::\=%" == "%__V%" (
set __ARGS=%__ARGS% %__V%
) else (
set __ARGS=%__ARGS%?%__V%
)
exit /b
:__END
endlocal & set __ARGS=%__ARGS%
exit /b
追記おわり
タイトルを下記から変更しました
【bat】全角スペースが含まれるファイルをそのまま扱う
そんなファイル有りませんと言われてイラッとしたので作りました
有る物投げてるのに何なのって
全体
fullspacefile_loader.bat
@echo off
for %%i in (%*) do if not exist %%i goto :_ARRANGE_MODE
for %%i in (%*) do call :_MAIN_LOOP %%i
goto :_NEXT
:_ARRANGE_MODE
for %%i in (%*) do call :_MERGE_ALL %%i
set _ARGS=%_ARGS:~1%
call :_DIVIDE_ARGS "%_ARGS:?=" "%"
goto :_NEXT
:_MERGE_ALL
set _V=%~1
if %_V::\=% == %_V% (
set _ARGS=%_ARGS% %_V%
) else (
set _ARGS=%_ARGS%?%_V%
)
exit /b
:_DIVIDE_ARGS
for %%i in (%*) do (
if exist %%i (
call :_MAIN_LOOP %%i
) else (
call :MESSAGE "not exist : %%~i"
)
)
exit /b
:MESSAGE
echo #
for %%i in (%*) do echo # %%~i
echo #
exit /b
:_MAIN_LOOP
echo %~dpnx1
exit /b
:_NEXT
call :MESSAGE "finish : %~nx0"
pause
ごちゃごちゃしちゃったけど私にはこれが限界
全体解説
読み込んだファイルを一度すべて連結し、ちゃんとした場所で分割する
callを使い、引数として渡すことで問題解消
個別解説
for %%i in (%*) do if not exist %%i goto :_ARRANGE_MODE
for %%i in (%*) do call :_MAIN_LOOP %%i
goto :_NEXT
存在しないファイルがないかチェック、あった場合 ラベル:_ARRANGE_MODE
へ移動
全て存在していたらそのまま通常処理し下記処理をジャンプして次の処理へ
:_ARRANGE_MODE
for %%i in (%*) do call :_MERGE_ALL %%i
set _ARGS=%_ARGS:~1%
call :_DIVIDE_ARGS "%_ARGS:?=" "%"
goto :_NEXT
引数を順次ラベル:_MERGE_ALL
へ投げて変数_ARGS
に結合させる
さらに_ARGS
を加工し、区切り文字 ? でファイルごとに分割しラベル:_DIVIDE_ARGS
へ投げる
:_MERGE_ALL
set _V=%~1
if %_V::\=% == %_V% (
set _ARGS=%_ARGS% %_V%
) else (
set _ARGS=%_ARGS%?%_V%
)
exit /b
渡された引数が
ドライブレターを含む場合、? を頭に付与し追加
ない場合、全角スペースを頭に付与し追加
:_DIVIDE_ARGS
for %%i in (%*) do (
if exist %%i (
call :_MAIN_LOOP %%i
) else (
call :MESSAGE "not exist : %%~i"
)
)
exit /b
気にしすぎかもしれないけど、ここでも存在確認
:MESSAGE
echo #
for %%i in (%*) do echo # %%~i
echo #
exit /b
:_MAIN_LOOP
echo %~dpnx1
exit /b
:_NEXT
call :MESSAGE "finish : %~nx0"
pause
ラベル:_MAIN_LOOP
ここで本来させたかった処理を記述
ラベル:_NEXT
続く処理を記述
あとがき
もっと簡単に回避する方法ないのかなorz