2016-03-02 90 views
0

我想从用户列表中删除文件作为参数。每个参数一行。批处理脚本在变量中读多行参数

如何将新行分隔的文件列表存储在变量中。

我正在使用下面的命令。

Set DeletionFiles=${p:DeleteFiles}" 

for %%i in (%DeletionFiles%) do (
    echo %%i 
) 

然后我想在一个循环中迭代它们。

${p:DeleteFiles}将被它从外部应用程序的值取代,它将包含以新行分隔的文件列表。我无法更改它。

+0

'$ {p:DeleteFiles}将被替换......其中将包含由新行分隔的文件列表。“ - 然后它不会在一个bach文件中工作!由于这不会设置多行变量,因此只需设置第一行,其余行会导致错误。 – jeb

回答

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命令)将在逗号(或空格)分隔的列表上完美地运行。

请注意,某些字符批量用于特殊用途,并且批处理字符串处理可能无法按预期方式处理它们。这些字符包括%^&

+0

我从外部应用程序获取文件名。我无法改变输入结构。它将包含新的行字符串 –

+0

我编辑了这个问题。请看看。 –

0

$ {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 
) 
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。这样,您可以对列表中的每个文件运行命令。在上面的代码是

  1. 打印各行,以嵌入在一些文本
  2. 控制台将其输出到文件
  3. 检查针对指定的字符串的行的前7个字符,然后将其复制到文件夹,如果它匹配
  4. ,然后删除它

如果您仍然需要从生成的列表中引用的每一行,你甚至可以设置类似阵列的结构。 (见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遍历全部行。不过,您需要掌握处理延迟扩展变量的知识。