Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何使用bat从文件中读取和操作变量?_Batch File - Fatal编程技术网

Batch file 如何使用bat从文件中读取和操作变量?

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

我想做什么: 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                                                   
: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位数+空格+下一行为空,这是错误的吗?或者在读取文件后执行a
set/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创建的吗(使用我的第二个代码)?