gpt4 book ai didi

arrays - 批处理 - 从数组中删除元素

转载 作者:行者123 更新时间:2023-12-03 21:31:43 30 4
gpt4 key购买 nike

我相信这个问题的答案应该很简单。我从一个地方获取目录列表并将它们存储到文本文档中。然后我读取文本文档名称并将它们存储到一个数组中。在此过程结束时,我希望删除数组中的所有条目。

我想这样做的原因是因为我要遍历多个文件夹位置并将它们存储到同一个数组中。然而,当我每次都没有清除数组时,当我稍后尝试打印出来时,它似乎给我带来了各种各样的麻烦。

我每次去填充下一个文件夹时都需要一个新数组。

REM **************************************************************************
REM this part needs to delete the value but doesnt
set !array[%arraywiper%]!=0

REM **************************************************************************

这是我遇到的问题的一个例子。可以运行下面的代码看看我在说什么。

ECHO OFF & setLocal EnableDELAYedExpansion
cls

REM creates folder for text doc
IF EXIST "c:\TEMP" (echo.) else (md c:\TEMP\)

REM Scans C:\Program Files (x86) and stores into a text doc
(for /f "delims=" %%a in ('dir /a:D-H-S /on /b "C:\Program Files (x86)"') do echo %%a)> c:\TEMP\dork_array_wipe.txt

REM Counts the folders in the text doc
for /d %%a in ("C:\Program Files (x86)\"*) do (
set /a locationcount+=1
)

REM Stores the values from the doc into an array
for /F "usebackq delims=" %%a in ("c:\TEMP\dork_array_wipe.txt") do (
set /A i+=1
call set array[%%i%%]=%%a
)

set arraywiper=1

:Arraywipeloop19

IF %arraywiper%==%locationcount% GOTO Arraywipecomplete19 else (

REM Prints array to show value entered array
echo array (%arraywiper%): !array[%arraywiper%]!


REM **************************************************************************
REM this part needs to delete the value but doesnt
set !array[%arraywiper%]!=0

REM **************************************************************************

Set /a arraywiper+=1

REM Prints out array in question to veryify change took place
echo array (%arraywiper%): !array[%arraywiper%]!
GOTO Arraywipeloop19
)

:Arraywipecomplete19


pause

先生。 Rojo 给了我一个很好的解决这个问题的方法。这是其工作原理的示例。

@echo off
setlocal

set "array[0]=foo"
set "array[1]=bar"
set "array[2]=baz"
set "array[3]=qux"
set "array[4]=quux"
set "array[5]=corge"

echo.
echo first printout

echo %array[0]%, %array[1]%, %array[2]%, %array[3]%, %array[4]%, %array[5]%
pause


rem // starting with element 3, delete 2 elements and insert 3 new
call :splice array 3 2 grault garply waldo

echo.
echo second printout

echo %array[0]%, %array[1]%, %array[2]%, %array[3]%, %array[4]%, %array[5]%, %array[6]%, %array[7]%
pause
call :splice array 0

REM set array[

REM goto :EOF

echo.
echo third printout

echo %array[0]%, %array[1]%, %array[2]%, %array[3]%, %array[4]%, %array[5]%, %array[6]%

pause

set "array[0]=foo"
set "array[1]=bar"
set "array[2]=baz"
set "array[3]=qux"
set "array[4]=quux"
set "array[5]=corge"

echo.
echo fourth printout

echo %array[0]%, %array[1]%, %array[2]%, %array[3]%, %array[4]%, %array[5]%, %array[6]%

pause




:splice <array_name> <startIDX> [<deleteCount> [<item1> [<item2> [...]]]]
rem // works like JavaScript Array.prototype.splice()
rem // https://developer.mozilla.org/en-US/search?q=Array.prototype.splice()
setlocal enabledelayedexpansion
set /a idx = 0, argskip = 0, inserted = 0, orig_ubound = -1
if "%~3"=="" (set /a "resume = 1 << 30") else set /a resume = %~2 + %~3
for /f "tokens=1* delims==" %%I in ('set %~1[') do (
set /a orig_ubound += 1
if !idx! lss %~2 (
set "tmp[!idx!]=%%J"
set /a ubound = idx, idx += 1
) else (
if !inserted! equ 0 (
for %%# in (%*) do (
set /a argskip += 1, inserted = 1
if !argskip! gtr 3 (
set "tmp[!idx!]=%%~#"
set /a ubound = idx, idx += 1, resume += 1
)
)
)
if !idx! geq !resume! (
set "tmp[!idx!]=%%J"
set /a ubound = idx, idx += 1
) else set /a resume -= 1
)
)
set "r=endlocal"
for /f "tokens=1* delims=[" %%I in ('2^>NUL set tmp[') do (
set "r=!r!&set "%~1[%%J""
)
for /L %%I in (%idx%,1,%orig_ubound%) do set "r=!r!&set "%~1[%%I]=""
%r%&exit/b

最佳答案

这是我上面评论的一个例子,演示了使用 setlocalendlocal 来忘记变量。

@echo off
setlocal

set idx=0

rem // populate array
setlocal enabledelayedexpansion
for /f "delims=" %%I in ('dir /b /a:-d') do (
set "array[!idx!]=%%~nxI"
set /a idx += 1
)

rem // display array
set array[

rem // destroy array
endlocal

rem // result
set array[

或者如果您更喜欢遍历数组元素而不是使用 set 来输出它们的值:

@echo off
setlocal

set idx=0

rem // populate array
setlocal enabledelayedexpansion
for /f "delims=" %%I in ('dir /b /a:-d') do (
set "array[!idx!]=%%~nxI"
set /a ubound = idx, idx += 1
)

rem // display array
for /L %%I in (0,1,%ubound%) do echo array[%%I]: !array[%%I]!

rem // destroy array
endlocal

rem // result
echo %array[0]%

编辑:如果您必须使用类似索引数组的方法来操作变量集合,我编写了一个:splice 函数,其工作方式与JavaScript 的Array.prototype.splice() 类似。 .您可以使用它来删除元素、插入元素、两者的组合,如果您愿意,甚至可以清除整个数组。 (只需 调用 :splice arrayname 0 即可取消设置数组中的所有元素。)

@echo off
setlocal

set "array[0]=foo"
set "array[1]=bar"
set "array[2]=baz"
set "array[3]=qux"
set "array[4]=quux"
set "array[5]=corge"

rem // starting with element 3, delete 2 elements and insert 3 new
call :splice array 3 2 grault garply waldo

set array[

goto :EOF

:splice <array_name> <startIDX> [<deleteCount> [<item1> [<item2> [...]]]]
rem // works like JavaScript Array.prototype.splice()
rem // https://developer.mozilla.org/en-US/search?q=Array.prototype.splice()
setlocal enabledelayedexpansion
set /a idx = 0, argskip = 0, inserted = 0, orig_ubound = -1
if "%~3"=="" (set /a "resume = 1 << 30") else set /a resume = %~2 + %~3
for /f "tokens=1* delims==" %%I in ('set %~1[') do (
set /a orig_ubound += 1
if !idx! lss %~2 (
set "tmp[!idx!]=%%J"
set /a ubound = idx, idx += 1
) else (
if !inserted! equ 0 (
for %%# in (%*) do (
set /a argskip += 1, inserted = 1
if !argskip! gtr 3 (
set "tmp[!idx!]=%%~#"
set /a ubound = idx, idx += 1, resume += 1
)
)
)
if !idx! geq !resume! (
set "tmp[!idx!]=%%J"
set /a ubound = idx, idx += 1
) else set /a resume -= 1
)
)
set "r=endlocal"
for /f "tokens=1* delims=[" %%I in ('2^>NUL set tmp[') do (
set "r=!r!&set "%~1[%%J""
)
for /L %%I in (%idx%,1,%orig_ubound%) do set "r=!r!&set "%~1[%%I]=""
%r%&exit/b

关于arrays - 批处理 - 从数组中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587964/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com