2016-09-07 8 views
0

私はバッチでテキストの冒険を書こうとしていますので、set userinput = bookのように変数を分割して配列に変換する方法を知りたいと思います。私は文字列を各スペースの配列アイテムに分割するプログラムを書くことができるようにしたい。私は他の多くの言語でこれをやってきました。このような他のいくつかの質問がありますが、私は彼らが私の質問に答えるように感じることはありません。変数をバッチで配列に分割する方法

答えて

3

このタスクはおそらくあなたが気づくよりもはるかに難しいでしょう。 "シンプルな"方法はたくさんありますが、シンプルなものはどれも堅牢ではありません。

たとえば、単純な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 
関連する問題