Batch file 如何使用bat从文件中读取和操作变量?
我想做什么: 1.运行bat文件并将其PID保存在txt文件中。 2.运行另一个bat,从txt文件读取先前存储的PID。 3.第二个bat使用从txt读取的PID终止进程 我有什么:在第一个主蝙蝠中:Batch file 如何使用bat从文件中读取和操作变量?,batch-file,Batch File,我想做什么: 1.运行bat文件并将其PID保存在txt文件中。 2.运行另一个bat,从txt文件读取先前存储的PID。 3.第二个bat使用从txt读取的PID终止进程 我有什么:在第一个主蝙蝠中: FOR /F %%T IN ('Wmic process where^(Name^="cmd.exe"^)get ProcessId^|more +1') DO ( SET /A ProcessId=%%T) &GOTO SkipLine
FOR /F %%T IN ('Wmic process where^(Name^="cmd.exe"^)get ProcessId^|more +1') DO (
SET /A ProcessId=%%T) &GOTO SkipLine
:SkipLine
echo %ProcessId%>>ID_MAIN_BAT.txt
FOR /F "eol=; tokens=2,3* delims=, " %i in (ID_MAIN_BAT.txt) do SET /P ID=%i%
taskkill /PID %ID%
这很好,我得到了一个包含PID的txt文件
我有什么:在第二个主蝙蝠中:
FOR /F %%T IN ('Wmic process where^(Name^="cmd.exe"^)get ProcessId^|more +1') DO (
SET /A ProcessId=%%T) &GOTO SkipLine
:SkipLine
echo %ProcessId%>>ID_MAIN_BAT.txt
FOR /F "eol=; tokens=2,3* delims=, " %i in (ID_MAIN_BAT.txt) do SET /P ID=%i%
taskkill /PID %ID%
结果:
第二只蝙蝠成功地用存储的PID杀死了第一只蝙蝠。
有人能帮我吗
完整的第二个文件:
我不知道,有点不对劲,没用。我把第二页的全部代码放在这里:
@echo off
if not "%1" == "max" start /MAX cmd /c %0 max
title AutoDestroy
color cf
echo.
start "" /min winamp Countdown.mp3
DEL /F Figura1.jpg >nul
TIMEOUT /T 3
taskkill /IM winamp.exe
DEL /F Countdown.mp3 >nul
DEL /F Countdown.bat >nul
DEL /F MainBat.bat >nul
DEL /F AutoDestroy.bat >nul
for /f "delims=" %%a in (ID_MAIN_BAT.txt) do taskkill /PID %%a
第一个BAT:使用
Wmic
@echo off & cls
for /f %%a in ('Wmic process where ^(Name^="cmd.exe"^) get ProcessId ^| findstr /r [0-9]') do (
set "$PID=%%a"
goto:next)
:next
>ID_MAIN_BAT.txt echo %$PID%
另一个更为有力的方法是在第一个BAT中使用标题,以获得任务列表的PID(因此,如果打开另一个CMD,则不会产生混淆):
for /f "delims=" %%a in (ID_MAIN_BAT.txt) do taskkill /PID %%a
第一个BAT:使用
任务列表
@echo off
title=Test
for /f "tokens=2 delims=," %%a in ('tasklist /v /fo csv ^| findstr /i "Test"') do set "$PID=%%a"
>ID_MAIN_BAT.txt echo %$PID%
第二棒:
for /f "delims=" %%a in (ID_MAIN_BAT.txt) do taskkill /PID %%a
我发现了你的建议不起作用的原因。 在我的主要bat中,我有第一行: 如果不是“%1”==“max”开始/max命令/c%0最大值和退出/B 这是为了在全屏模式下对抗蝙蝠,但它有一个主要的缺点: 如果我从末尾删除并退出/B,它将打开2(两)个相同的bat文件。 通过这样做,我意识到输出文件中写入的PID属于由&exit/B命令关闭的第一个进程,这就是为什么cmd无法终止该进程,因为它已经被&exit/B禁止 如果我不再放第一行(带全屏选项),并且如果我将bat文件转换为exe,我就可以使用TASKKILL/IM MAIN_bat.exe 它是有效的
伙计们,没有你们我就买不到了,非常感谢 一,。在第二个
.bat
中,您还需要将%%
变量(如%%i
)的符号加倍;2.set
命令应为:set ID=%%i
(也可以是双-%%
,无/P
开关);作为读取文件(包含单个ID)的for/F
循环的替代方法,您可以声明set/P ID=I got it。我认为SachaDee的代码(见下)适合我所寻找的东西。但是当它从txt中读取或读取时,似乎是一个问题。如果在txt文件中(如我所说),4位数+空格+下一行为空,这是错误的吗?或者在读取文件后执行aset/a ID=ID
,这样ID
将只包含一个纯数值;或者,当使用for/F
读取时,不要指定标记、delims
,因此让for/F
使用默认选项……或者更好:在第一批文件中,插入括号:(echo%ProcessId%)>>ID\u MAIN\u BAT.txt
,要避免将尾随空格写入文件,请检查我的编辑。您最好使用标题
和任务列表
来获取PID,或者在findstr/r[1-9]
中获取值来获取一个干净的值(如果您仍然希望使用wmic来获取),它仍然有效,但我认为原因是txt文件。它包含4个数字,一个空白,后面一行空白。我做了所有这些,以便从第二个关闭主bat文件。我找不到比这更好的方法了。如果你知道怎么做,请给出建议!:(检查我的第二次编辑!我不知道是什么问题,它不起作用。我附加了netire第二个bat代码。可能是指令之间的冲突。无论如何,我感谢你的时间!ID_MAIN_bat.txt是用PID创建的吗(使用我的第二个代码)?