Windows批处理串联使用2个列表

时间:2016-05-25 07:05:26

标签: batch-file

我正在编写一个批处理来杀死多个进程,如果它们正在运行,并随后删除它们是否正在运行的文件。我对此非常陌生,所以请忍受可怕的剧本。

@echo off
echo deleting files...
tasklist /FI "IMAGENAME eq file1.exe" | find /I /N "file1.exe"> nul 2>&1
if errorlevel 1 (
            echo file1.exe is not running
            goto :delete
                ) else (
                    taskkill /F /IM file1.exe> nul 2>&1
                    if errorlevel 1 (
                                echo Killing process file1.exe... Failed!
                                    ) else (
                                        goto :delete
                                            )
                        )
:delete
ren c:\file1.exe c:\tmp.tmp> nul 2>&1
if errorlevel 1 (
            echo Deleting file1.exe... Access Denied!
                ) else (
                    del /q /f "C:\tmp.tmp"> nul 2>&1
                    echo Deleting file1.exe... Success!
                        )

而不是对所有8个文件执行此操作,我希望使用两个列表来存储文件名和文件路径,并同时通过for循环运行它们。不幸的是,我无法在线找到关于如何串联循环2个列表的大量信息,以下脚本会遇到明显的问题:

for %%f in (file1 file2 file3) do 
    for %%p in (path1 path2 path3) do (
                                taskkill %f etc
                                del %p etc
                                    )

一些帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您只需要一个包含完整路径的FOR循环,然后使用%~nx修饰符来获取名称。

这是伪代码:

for %%F in ("path1\file1" "path2\file2" "path3\file3") do (
  taskkill %%~nxF
  del %%F
)

有关修饰符的更多信息,请从命令行使用help forfor /?,并查看帮助的底部。

但有时您希望处理配对值列表。这可以通过两个循环轻松完成。第一个循环迭代分隔对,第二个FOR / F循环解析出该对中的每个值。您只需选择一个永远不会出现在值中的分隔符。

使用空格分隔符:

for %%A in ("val1a val1b" "val2a val2b" "val3a val3b") do (
  for /f "tokens=1,2" %%B in ("%%~A") do (
    echo value1 = %%B
    echo value2 = %%C
    echo(
  )
)

使用竖线分隔符:注意如何跨越多行以提高可读性

for %%A in (
  "val 1a|val 1b"
  "val 2a|val 2b"
  "val 3a|val 3b"
) do for /f "delims=| tokens=1,2" %%B in ("%%~A") do (
  echo value1 = %%B
  echo value2 = %%C
  echo(
)
相关问题