【问题标题】:Batch script Read multi line Argument in Variable批处理脚本读取变量中的多行参数
【发布时间】:2016-03-02 12:44:44
【问题描述】:

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

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

我正在使用以下命令。

Set DeletionFiles=${p:DeleteFiles}"

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

然后我想循环迭代它们。

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

【问题讨论】:

  • ${p:DeleteFiles} will get replaced ... which will contain list of files separated by new line. -- 那么它在 bach 文件中将不起作用!由于这不会设置多行变量,它只是设置第一行,其余行会导致错误。

标签: batch-file batch-processing


【解决方案1】:
@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 命令)将在逗号(或空格)分隔的列表上完美运行。

请注意,批处理将某些字符用于特殊目的,批处理字符串处理可能无法以预期的方式处理它们。这些字符包括% ^&

【讨论】:

  • 我正在从外部应用程序获取文件名。我无法更改输入结构。它将包含新行字符串
【解决方案2】:

${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
)

【讨论】:

    【解决方案3】:

    如果我理解正确,您的外部程序将生成一个文件列表。然后,您希望将此多行列表存储到一个变量中。拥有变量后,您想对它做什么?我假设您想删除文件,但您的问题在这一点上并不清楚,所以我会尝试过度回答以涵盖它。

    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! 等于当前行的值。然后,您可以将每一行引用为var1var2 等等,或者,如第二部分所示,您可以使用for /L 遍历它们。不过,您需要掌握如何使用延迟扩展变量。

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多