Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在批处理中,按分隔符将字符串拆分为文件中的新行_Batch File_Split_Substring - Fatal编程技术网

Batch file 在批处理中,按分隔符将字符串拆分为文件中的新行

Batch file 在批处理中,按分隔符将字符串拆分为文件中的新行,batch-file,split,substring,Batch File,Split,Substring,在批处理中,我尝试将字符串拆分为子字符串,最好是基于分隔符 本例有效,但是否有更好的方法: for /f "tokens=1-20 delims=:" %%a in (string.txt) do ( echo %%a& echo.%%b& echo.%%c& echo.%%d& echo.%%e& echo.%%f& echo.%%g& echo.%%h& echo.%%i& echo.%%j echo.%%k&

在批处理中,我尝试将字符串拆分为子字符串,最好是基于分隔符

本例有效,但是否有更好的方法:

for /f "tokens=1-20 delims=:" %%a in (string.txt) do (
echo %%a& echo.%%b& echo.%%c& echo.%%d& echo.%%e& echo.%%f& echo.%%g& echo.%%h& echo.%%i& echo.%%j
echo.%%k& echo.%%l& echo.%%m& echo.%%n& echo.%%o& echo.%%p& echo.%%q& echo.%%r& echo.%%s& echo.%%t
) >substrings.txt
我已尝试使用Magoo,它适用于默认分隔符,但使用冒号失败:

@echo off
setLocal 
for /f "delims=:" %%a in (string.txt) do (
for %%i in (%%a) do echo %%i >>substrings.txt
)
我也尝试过从Aacini,但它似乎失败使用特殊字符

@echo off
setlocal EnableDelayedExpansion

set i=1
set "x=%string%"
set "x!i!=%x::=" & set /A i+=1 & set "x!i!=%"
set x >substrings.txt
示例%string%var或string.txt为:

Select project:/option:report name="Sustainability":option value="201":Huonville:/option:/report:report name="Energy and Water Management":option value="102":Cygnet:/option:/report:report name="Tree Management":option value="101":Cygnet:/option:/report:option disabled="disabled":/option:/select
我正在尝试将%string%var或string.txt输出到substring.txt,如下所示:

Select project
/option
report name="Sustainability"
option value="201"
Huonville
/option
/report
report name="Energy and Water Management"
option value="102"
Cygnet
/option
/report
report name="Tree Management"
option value="101"
Cygnet
/option
/report
option disabled="disabled"
/option
/select
任何帮助都将不胜感激。谢谢

当您使用for/f时,您需要知道有多少代币,并且对最大代币有一个限制

您需要一个普通for循环,但不能选择应该使用哪个分隔符

因此,用空格替换每个分隔符。确保每个标记周围都有引号,以保留原始空格。为此,请在整个字符串周围加引号,并将delimter:替换为:

仅出于学术原因的另一种方法:

 @echo off
setlocal 
set "string=Select project:/option:report name="Sustainability":option value="201":Huonville:/option:/report:report name="Energy and Water Management":option value="102":Cygnet:/option:/report:report name="Tree Management":option value="101":Cygnet:/option:/report:option disabled="disabled":/option:/select"

call :recur %string%
goto :eof

:recur
rem echo loop with %*
for /f "tokens=1,* delims=:" %%a in ("%*") do ( 
  echo %%a
  if not "%%~b" == "" call :recur %%b
  goto :eof
)
echo.
注意:由于堆栈大小,存在递归限制。它适用于给定的字符串,但当字符串包含更多令牌时可能会失败。

当您使用for/f时,您需要知道有多少令牌,并且对max令牌有一个限制

您需要一个普通for循环,但不能选择应该使用哪个分隔符

因此,用空格替换每个分隔符。确保每个标记周围都有引号,以保留原始空格。为此,请在整个字符串周围加引号,并将delimter:替换为:

仅出于学术原因的另一种方法:

 @echo off
setlocal 
set "string=Select project:/option:report name="Sustainability":option value="201":Huonville:/option:/report:report name="Energy and Water Management":option value="102":Cygnet:/option:/report:report name="Tree Management":option value="101":Cygnet:/option:/report:option disabled="disabled":/option:/select"

call :recur %string%
goto :eof

:recur
rem echo loop with %*
for /f "tokens=1,* delims=:" %%a in ("%*") do ( 
  echo %%a
  if not "%%~b" == "" call :recur %%b
  goto :eof
)
echo.

注意:由于堆栈大小,存在递归限制。它与给定的字符串一起工作,但当字符串包含更多令牌时可能会失败。

这是Stephan的总结

@echo off
setlocal enabledelayedexpansion
set /p string=<"input.txt"
set "string=%string: =@%"
set "string="%string::=" "%"
(for %%a in (%string%) do (
  set "output=%%~a"  
  echo !output:@= !
))>output.txt

这是Stephan的总结

@echo off
setlocal enabledelayedexpansion
set /p string=<"input.txt"
set "string=%string: =@%"
set "string="%string::=" "%"
(for %%a in (%string%) do (
  set "output=%%~a"  
  echo !output:@= !
))>output.txt
请参阅@dbenham的惊人字符串替换。它适用于任何字符,甚至惊叹

请参阅@dbenham的惊人字符串替换。它适用于任何字符,甚至惊叹


我不确定我是否听懂了。我可以将string.txt输出为空格,而不是冒号:作为分隔符,但这会破坏原始空格,这就是为什么我认为使用冒号:会更好。但据我所知,Stephan您的代码需要冒号:分隔符将所有标记用引号括起来,修改后的字符串将作为普通for循环再次运行。这是正确的吗?也许我应该继续用echo。是的,你总结得很好。请参阅第一个代码的最后一行,以查看要由for解析的已更改字符串。For将alpha-beta作为两个标记,但alpha-beta仅作为一个标记,这是保持原始空格不变的诀窍。Stephan,你能演示一下我如何将修改后的字符串回送到新行,因为我仍然得到一个长的修改字符串。将字符串拆分为子字符串的意义在于,我可以在“findstr search substring.txt”中使用/f%%a进行搜索。经过长时间修改的字符串只是为了向您展示。请参阅前面的输出。我用find更改了我的第一个代码。输出在空格上被破坏。它在长字符串中看起来是正确的,但如果我尝试使用搜索或重定向来自…echo%%~a>substrings.txt的输出,则标记已损坏。我不确定我是否在跟踪。我可以将string.txt输出为空格,而不是冒号:作为分隔符,但这会破坏原始空格,这就是为什么我认为使用冒号:会更好。但据我所知,Stephan您的代码需要冒号:分隔符将所有标记用引号括起来,修改后的字符串将作为普通for循环再次运行。这是正确的吗?也许我应该继续用echo。是的,你总结得很好。请参阅第一个代码的最后一行,以查看要由for解析的已更改字符串。For将alpha-beta作为两个标记,但alpha-beta仅作为一个标记,这是保持原始空格不变的诀窍。Stephan,你能演示一下我如何将修改后的字符串回送到新行,因为我仍然得到一个长的修改字符串。将字符串拆分为子字符串的意义在于,我可以在“findstr search substring.txt”中使用/f%%a进行搜索。经过长时间修改的字符串只是为了向您展示。请参阅前面的输出。我用find更改了我的第一个代码。输出在空格上被破坏。它在经过长时间修改的字符串中看起来是正确的,但如果我尝试使用搜索或重定向来自…echo%%~a>substrings.txt的输出,则标记将被破坏。
@echo off
====SETLOCAL EnableDelayedExpansion EnableExtensions


set "B=^!"
set "C=^"
set ^"L=^
%===Line Feed===%
"
for /F "eol=N" %%C in ('wmic os get Name /value') do set "R=%%C" Carriage Return
set ^"E=!R!!L!" CRLF


>nul 2>&1 certutil -f -encodehex String.txt "%temp%\hex.txt" 4


pushd "%temp%"
>expand.txt (FOR /F "delims=" %%A in (hex.txt) do FOR %%B in (%%A) do (
    set "char=%%B"
    REM ! --> !B! ###
    set "char=!char:21=21 42 21!"
    REM ^ --> !C! ###
    set "char=!char:5e=21 43 21!"
    REM <CR> --> !R! ###
    set "char=!char:0a=21 4c 21!"
    REM <LF> --> !L! ###
    set "char=!char:0d=21 52 21!"


    REM : --> !R!!L! ###
    set "char=!char:3a=21 45 21!"
    echo(!char!
))


>nul 2>&1 certutil -f -decodehex expand.txt rawContent.txt
for /f delims^=^ eol^= %%A in (rawContent.txt) do set "modified=%%A"
del hex.txt expand.txt rawContent.txt
popd


>substring.txt (
echo(!modified!
)