我想从用户列表中删除文件作为参数。每个参数一行。批处理脚本在变量中读多行参数
如何将新行分隔的文件列表存储在变量中。
我正在使用下面的命令。
Set DeletionFiles=${p:DeleteFiles}"
for %%i in (%DeletionFiles%) do (
echo %%i
)
然后我想在一个循环中迭代它们。
${p:DeleteFiles}
将被它从外部应用程序的值取代,它将包含以新行分隔的文件列表。我无法更改它。
我想从用户列表中删除文件作为参数。每个参数一行。批处理脚本在变量中读多行参数
如何将新行分隔的文件列表存储在变量中。
我正在使用下面的命令。
Set DeletionFiles=${p:DeleteFiles}"
for %%i in (%DeletionFiles%) do (
echo %%i
)
然后我想在一个循环中迭代它们。
${p:DeleteFiles}
将被它从外部应用程序的值取代,它将包含以新行分隔的文件列表。我无法更改它。
@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
命令)将在逗号(或空格)分隔的列表上完美地运行。
请注意,某些字符批量用于特殊用途,并且批处理字符串处理可能无法按预期方式处理它们。这些字符包括%
^
和&
。
我从外部应用程序获取文件名。我无法改变输入结构。它将包含新的行字符串 –
我编辑了这个问题。请看看。 –
$ {P:DeleteFiles}将被替换由它的外部应用程序, 值将包含新的line.I不能 改变它分隔的文件列表。
更换后的批处理文件看起来像:
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
)
如果我理解正确的话,你的外部程序会生成文件列表。然后你想把这个多行列表存储到一个变量中。一旦拥有它,你想对变量做什么?我假设你想要删除这些文件,但是你的问题在这一点上并不清楚,所以我会尽量回答覆盖它。
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
遍历全部行。不过,您需要掌握处理延迟扩展变量的知识。
'$ {p:DeleteFiles}将被替换......其中将包含由新行分隔的文件列表。“ - 然后它不会在一个bach文件中工作!由于这不会设置多行变量,因此只需设置第一行,其余行会导致错误。 – jeb