我正在编写一个批处理来杀死多个进程,如果它们正在运行,并随后删除它们是否正在运行的文件。我对此非常陌生,所以请忍受可怕的剧本。
@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
)
一些帮助将不胜感激!
答案 0 :(得分:0)
您只需要一个包含完整路径的FOR循环,然后使用%~nx
修饰符来获取名称。
这是伪代码:
for %%F in ("path1\file1" "path2\file2" "path3\file3") do (
taskkill %%~nxF
del %%F
)
有关修饰符的更多信息,请从命令行使用help for
或for /?
,并查看帮助的底部。
但有时您希望处理配对值列表。这可以通过两个循环轻松完成。第一个循环迭代分隔对,第二个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(
)