0
私はバッチでテキストの冒険を書こうとしていますので、set userinput = bookのように変数を分割して配列に変換する方法を知りたいと思います。私は文字列を各スペースの配列アイテムに分割するプログラムを書くことができるようにしたい。私は他の多くの言語でこれをやってきました。このような他のいくつかの質問がありますが、私は彼らが私の質問に答えるように感じることはありません。変数をバッチで配列に分割する方法
私はバッチでテキストの冒険を書こうとしていますので、set userinput = bookのように変数を分割して配列に変換する方法を知りたいと思います。私は文字列を各スペースの配列アイテムに分割するプログラムを書くことができるようにしたい。私は他の多くの言語でこれをやってきました。このような他のいくつかの質問がありますが、私は彼らが私の質問に答えるように感じることはありません。変数をバッチで配列に分割する方法
このタスクはおそらくあなたが気づくよりもはるかに難しいでしょう。 "シンプルな"方法はたくさんありますが、シンプルなものはどれも堅牢ではありません。
たとえば、単純なFORループは個々のトークンを解析できますが、*
,?
、おそらくは"
で壊れます。
堅牢なソリューションには、相当量のコードが必要です。ここで
私の解決策は、多くのコメントで、次のとおりです。
@echo off
:: Start out with delayed expansion disabled, and define "user input"
:: I intentionally include "problem" characters
setlocal disableDelayedExpansion
set "userinput=take book! & ;MustPreserve EmptyLinesAreIgnored"
:: Initialize count
set "cnt=0"
:: Enable and use delayed expansion to protect against poison characters
setlocal enableDelayedExpansion
:: Substitute <LineFeed> for each <space>
(set parsed=!userinput: =^
%= Do not remove or alter this line =%
!)
:: Iterate each line, setting delims and eol to <space> to preserve all tokens
for /f "eol= delims= " %%A in ("!parsed!") do (
%= Return to delayed expansion disabled on first iteration, else ! is lost =%
if "!" equ "" endlocal
%= Increment the count =%
set /a cnt+=1
%= Temporarily enable delayed expansion to capture current count in FOR variable =%
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
%= Save the array value =%
set "token.%%N=%%A"
)
)
::Print the results. Safe array access requires delayed expansion
setlocal enableDelayedExpansion
for /l %%N in (1 1 !cnt!) do echo token.%%N=!token.%%N!
それはすべてのコメント
@echo off
setlocal disableDelayedExpansion
set "userinput=take book! & :MustPreserveColon ;MustPreserve EmptyLinesAreIgnored"
set "cnt=0"
setlocal enableDelayedExpansion
(set parsed=!userinput: =^
%= Do not remove or alter this line =%
!)
for /f "eol= delims= " %%A in ("!parsed!") do (
if "!" equ "" endlocal
set /a cnt+=1
setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
endlocal
set "token.%%N=%%A"
)
)
setlocal enableDelayedExpansion
for /l %%N in (1 1 !cnt!) do echo token.%%N=!token.%%N!
そして、ここにせずに少し良く見える出力されます:
token.1=take
token.2=book!
token.3=&
token.4=;MustPreserve
token.5=EmptyLinesAreIgnored