LoginSignup
0
0

【bat】全角スペースのアレを回避【追記:外部batで処理】

Last updated at Posted at 2024-02-03

新しい記事書きました

追記

外部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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0