批处理脚本在变量中读取多行参数

时间:2016-03-02 12:44:44

标签: batch-file batch-processing

我想从用户中删除要删除的文件列表作为参数。每个参数一行。

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

我正在使用以下命令。

Set DeletionFiles=${p:DeleteFiles}"

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

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

${p:DeleteFiles}将被外部应用程序的值替换,外部应用程序将包含由换行符分隔的文件列表。我无法更改它。

3 个答案:

答案 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您指定的任何命令。这样,您就可以对列表中的每个文件运行命令。在上面的代码中它是

  1. 将每一行打印到嵌入在某些文本中的控制台
  2. 将其输出到文件
  3. 根据指定的字符串检查该行的前7个字符,然后将其复制到符合
  4. 的文件夹中
  5. 然后将其删除
  6. 如果您仍需要从生成的列表中引用每一行,您甚至可以设置类似于数组的结构。 (见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!设置为等于当前行的值。然后,您可以将每行引用为var1var2等,或者,如第二部分所示,您可以使用for /L循环遍历它们。但是,您需要掌握使用延迟扩展变量的方法。