Batch file 无法清除win 7 cmd提示批处理文件中set/p变量的内容

Batch file 无法清除win 7 cmd提示批处理文件中set/p变量的内容,batch-file,cmd,Batch File,Cmd,我有一个批处理文件,它需要终止符合关键字的进程。这是我的批处理文件: @echo off REM tkill.bat IF [%1] == [] GOTO Syntx tasklist | find /i "%1%" > ttt.txt set /p line=<ttt.txt for /f %%G in ("%line%") do set "pp=%%G" if [%pp] == [] GOTO endit taskkill /f /im %pp% del ttt.txt

我有一个批处理文件,它需要终止符合关键字的进程。这是我的批处理文件:

@echo off
REM tkill.bat  
IF [%1] == [] GOTO Syntx

tasklist | find /i "%1%" > ttt.txt
set /p line=<ttt.txt
for /f %%G in ("%line%") do set "pp=%%G"

if [%pp] == [] GOTO endit
taskkill /f /im %pp%
del ttt.txt
goto endit

:syntx
echo Syntax:
echo   tkill partial_process_name
:endit
set line=
我得到这个输出

C:\Windows\system32>tkill opera
SUCCESS: The process "opera.exe" with PID 3572 has been terminated.
SUCCESS: The process "opera.exe" with PID 9320 has been terminated.
SUCCESS: The process "opera.exe" with PID 6628 has been terminated.
SUCCESS: The process "opera.exe" with PID 2220 has been terminated.
SUCCESS: The process "opera.exe" with PID 4184 has been terminated.
SUCCESS: The process "opera.exe" with PID 5816 has been terminated.
SUCCESS: The process "opera.exe" with PID 9816 has been terminated.
SUCCESS: The process "opera.exe" with PID 7416 has been terminated.
SUCCESS: The process "opera.exe" with PID 684 has been terminated.
SUCCESS: The process "opera.exe" with PID 4688 has been terminated.
所以我检查是否有任何掉队进程

C:\Windows\system32>tasklist | find /i "opera"

C:\Windows\system32>
没有。 然后我再次运行相同的命令,并查看输出:

tkill opera
ERROR: The process "opera.exe" not found.
这是我的问题:内存中没有opera.exe命名的进程。因此我
tasklist | find/i“%1%”ttt.txt
命令应生成一个空文件。然而opera.exe的名字却在某个地方被卡住了,直到我关闭dos提示符并打开一个新的,或者用另一个进程名运行同一个命令,而这个进程名实际上正在运行并被终止。然后,新名称会卡在内存中,例如:

C:\Windows\system32>tkill notepad.exe
SUCCESS: The process "notepad.exe" with PID 5952 has been terminated.

C:\Windows\system32>tkill notepad.exe
ERROR: The process "notepad.exe" not found.

C:\Windows\system32>tkill neon
ERROR: The process "notepad.exe" not found.

C:\Windows\system32>

在我对如何分配windows变量的理解中缺少了一些东西,但我不知道缺少了什么。感谢您的帮助。

经过测试

尝试将
setlocal
endlocal
添加到脚本中

使用
setlocalenabledelayedexpansion
也可以很好地工作必要时

@echo off
setlocal
REM tkill.bat

IF [%1] == [] GOTO Syntx

tasklist | find /i "%1%" > ttt.txt
set /p line=<ttt.txt
for /f %%G in ("%line%") do set "pp=%%G"
if [%pp] == [] GOTO endit
taskkill /f /im %pp%
del ttt.txt
endlocal
goto endit

:syntx
echo Syntax:
echo   tkill partial_process_name

:endit
set line=
@echo关闭
setlocal
雷姆·特基尔·巴特
如果[%1]=[]转到Syntx
任务列表|查找/i“%1%”ttt.txt

设置/p行=已测试

尝试将
setlocal
endlocal
添加到脚本中

使用
setlocalenabledelayedexpansion
也可以很好地工作必要时

@echo off
setlocal
REM tkill.bat

IF [%1] == [] GOTO Syntx

tasklist | find /i "%1%" > ttt.txt
set /p line=<ttt.txt
for /f %%G in ("%line%") do set "pp=%%G"
if [%pp] == [] GOTO endit
taskkill /f /im %pp%
del ttt.txt
endlocal
goto endit

:syntx
echo Syntax:
echo   tkill partial_process_name

:endit
set line=
@echo关闭
setlocal
雷姆·特基尔·巴特
如果[%1]=[]转到Syntx
任务列表|查找/i“%1%”ttt.txt

set/p line=由于允许此程序在任何正在运行的进程中的任何位置匹配输入字符串都会有太多问题,因此我会在您的
tkill.bat
文件中提供更简单的语法:

@If“%~1”==”(Echo语法:&Echo tkill partial\u process\u name)Else TaskKill/Fi“ImageName Eq%~1*”/F/T
如果您愿意,您可以将上述内容拆分为多行,以便于阅读:

@Echo关闭
如果“%~1”==”“(
回显语法:
Echo tkill部分进程名称
)Else TaskKill/Fi“ImageName Eq%~1*”/F/T

这不需要写入、读取和删除文件,也不需要定义变量或其他方式。也不依赖于
find.exe
(尤其是
ImageName Eq
选项已经不区分大小写)。您还将注意到,使用
TaskKill
无需检查
Tasklist
的输出,如果未找到匹配的进程,则它无法“杀死”它,并将提供一条
INFO:
消息让您知道(而不是您当前收到的
错误:
消息).

由于允许此程序在任何正在运行的进程中的任何位置匹配输入字符串都会有太多问题,因此我将在您的
tkill.bat
文件中提供以下更简单的语法:

@If“%~1”==”(Echo语法:&Echo tkill partial\u process\u name)Else TaskKill/Fi“ImageName Eq%~1*”/F/T
如果您愿意,您可以将上述内容拆分为多行,以便于阅读:

@Echo关闭
如果“%~1”==”“(
回显语法:
Echo tkill部分进程名称
)Else TaskKill/Fi“ImageName Eq%~1*”/F/T

这不需要写入、读取和删除文件,也不需要定义变量或其他方式。也不依赖于
find.exe
(尤其是
ImageName Eq
选项已经不区分大小写)。您还将注意到,使用
TaskKill
无需检查
Tasklist
的输出,如果未找到匹配的进程,则它无法“杀死”它,并将提供一条
INFO:
消息让您知道(而不是您当前收到的
错误:
消息).

如果[%pp]=[]转到endit
N.注意:在
如果[/code>条件中,使用引号代替
[
/
]
,比如
如果“%~1”==”转到syntx
…如果运行
设置pp=/code>可以避免它。但出于某种原因,脚本正在创建
pp
作为环境变量。您可以在不同的命令提示符下使用
setpp
检查。尝试在脚本的开头使用
setlocal
,在脚本的结尾使用
endlocal
。如果[%pp]=[]转到endit
N.B.:在
if
条件中使用引号,而不是
[
/
]
中缺少一个
%
,就像
如果“%~1”==”转到syntx
…如果运行
设置pp=
,可以避免它。但出于某种原因,脚本正在创建
pp
作为环境变量。您可以在不同的命令提示符下使用
set pp
进行检查。尝试在脚本开头使用
setlocal
,在脚本结尾使用
endlocal