我想从用户中删除要删除的文件列表作为参数。每个参数一行。
如何在变量中存储由新行分隔的文件列表。
我正在使用以下命令。
Set DeletionFiles=${p:DeleteFiles}"
for %%i in (%DeletionFiles%) do (
echo %%i
)
然后我想在循环中迭代它们。
${p:DeleteFiles}
将被外部应用程序的值替换,外部应用程序将包含由换行符分隔的文件列表。我无法更改它。
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
SET "deletionfiles="
:dloop
SET "deleteme="
SET /p "deleteme=Which file to delete ? "
IF DEFINED deleteme SET "deleteme=%deleteme:"=%"
IF DEFINED deleteme SET "deletionfiles=%deletionfiles%,"%deleteme%""&goto dloop
ECHO delete %deletionfiles:~1%
GOTO :EOF
无需使用换行符。您的for
命令(或del
命令)将在逗号(或空格)分隔列表中完美地运行。
请注意,批处理使用某些字符用于特殊目的,批处理字符串处理可能无法以预期方式处理它们。这些字符包括%
^
和&
。
答案 1 :(得分:0)
$ {p:DeleteFiles}将被外部应用程序的值取代, 它将包含由新行分隔的文件列表。我不能 改变它。
替换后,批处理文件如下所示:
Set DeletionFiles=file1.jpg
file2.jpg
file3.jpg
"
这不再是有效的批处理文件 此外,修改批处理文件本身是个坏主意,因为这只能运行一次。
您可以将${p:DeleteFiles}
放入另一个文件,例如input.txt
。
您的批次看起来像
echo ${p:DeleteFiles} > input.txt
<external program for replacing the DeleteFiles> input.txt
for /F "tokens=*" %%A in (input.txt) do (
echo File: %%A
)
答案 2 :(得分:0)
如果我理解正确,您的外部程序将生成一个文件列表。然后,您希望将此多行列表存储到变量中。一旦你拥有它,你想对变量做什么?我假设您要删除这些文件,但是您的问题在这一点上并不清楚,所以我会尝试过度回答以覆盖它。
for /f "delims=" %%a in ('{command that generates your list}') do (
echo Doing stuff to %%a...
echo %%a>>listOfFilesToDelete.txt
set var=%%a
if "%var:~0,7%"="DoNotDelete" copy "%%a" \someArchiveFolder\
del "%%a"
)
这会将生成的列表中的每一行都读为变量%%a
。然后它将do
您指定的任何命令。这样,您就可以对列表中的每个文件运行命令。在上面的代码中它是
如果您仍需要从生成的列表中引用每一行,您甚至可以设置类似于数组的结构。 (见Create list or arrays in Windows Batch)
setlocal EnableDelayedExpansion
:: Capture lines in an 'array'
set /a i=0
for /f "delims=" %%a in ('dir /b') do (
set /a i+=1
set var!i!=%%a
)
:: Loop through the 'array'
for /L %%a in (1,1,%i%) do (
echo Do more stuff with !var%%a!
)
如上所述,这会将生成的列表中的每一行都读为变量%%a
。然后它将变量var!i!
设置为等于当前行的值。然后,您可以将每行引用为var1
,var2
等,或者,如第二部分所示,您可以使用for /L
循环遍历它们。但是,您需要掌握使用延迟扩展变量的方法。