在Bat文件中设置参数时如何转义空格

问题描述 投票:0回答:2

我正在尝试这样做:

@echo off
Set ^"Processes=Sample.exe ^
The Sample Program.exe^"

但是

The Sample Program.exe
充当三个单独的文件
The
Sample
Program.exe

逃离空间的程序是什么?

完整代码:

for %%a in (%Processes%) Do (
    for /f %%b in ('tasklist /NH /FI "imagename eq %%a"') Do (
        if [%%b]==[%%a] (
            echo %%b is running
            Color 0C
            echo  Killing %%b ...
            Taskkill /f /im "%%b"
        ) else (
            Color 0A
            echo %%a is not running
        )
    )
)
pause & exit

有类似的事情吗?

for /F "tokens=1* delims=," %%b

batch-file cmd
2个回答
2
投票

我认为您想要实现的简单演示代码是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set Processes="cmd.exe Windows Command Processor" "cscript.exe Console Based Script Host"
for %%G in (%Processes%) do for /F "eol=| tokens=1*" %%H in (%%G) do (
    echo File name is: %%H
    echo Process name: %%I
)
endlocal

执行该批处理文件的输出是:

File name is: cmd.exe
Process name: Windows Command Processor
File name is: cscript.exe
Process name: Console Based Script Host

因此环境变量

Processes
是用双引号括起来的多个字符串定义的。每个字符串首先是一个可执行文件的文件名,没有路径,并用空格(也可以是不同的字符)分隔,进程名称或与可执行文件名关联的任何内容,不应包含
?
* 
.

外部 FOR 循环将一个用双引号括起来的字符串一个接一个地分配给指定的循环变量

G

内部 FOR 循环将当前分配给循环变量

G
的字符串拆分为两个子字符串,并将第一个普通空格/水平制表符分隔字符串分配给指定的循环变量
H
以及一个或多个空格/制表符之后的所有其他内容到下一个但只有一个循环变量
I

分配给

H
的可执行文件名和分配给
I
的关联字符串可以在内部 FOR 循环的命令块中用于任何目的。

此方法适用于批处理文件应该执行的操作:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set Processes="notepad.exe Windows Notpad" "cscript.exe Console Based Script Host"
for %%G in (%Processes%) do for /F "eol=| tokens=1*" %%H in (%%G) do (
    %SystemRoot%\System32\tasklist.exe /NH /FI "imagename eq %%H" 2>nul | %SystemRoot%\System32\find.exe /I "%%H" >nul
    if not errorlevel 1 (
        echo %%I is running.
        color 0C
        echo Terminating %%I ...
        %SystemRoot%\System32\taskkill.exe /IM "%%H" >nul
    ) else (
        color 0A
        echo %%I is not running.
    )
)
color
endlocal

此代码中删除了强制操作系统残酷终止正在运行的进程的选项

/F
。大多数应用程序会在 TASKKILL 向正在运行的应用程序发送 WM_CLOSE 消息时优雅地终止自身。

请注意,关闭脚本解释器的所有实例,如

cmd.exe
cscript.exe
wscript.exe
powershell.exe
(由 TASKKILL 完成,仅将图像名称作为参数传递)通常不好。例如,当前处理批处理文件的
cmd.exe
实例也将在使用此批处理代码终止使用不同控制台窗口并行运行的
cmd.exe
时终止。

可执行文件名带有一个或多个空格的异常情况示例,使用

|
作为文件名和任何文件名都不能包含的关联字符串之间的分隔符:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set Processes="notepad.exe|Windows Notpad" "cscript.exe|Console Based Script Host" "show time.exe|Show Time Information"
for %%G in (%Processes%) do for /F "eol=| tokens=1* delims=|" %%H in (%%G) do (
    %SystemRoot%\System32\tasklist.exe /NH /FI "imagename eq %%H" 2>nul | %SystemRoot%\System32\find.exe /I "%%H" >nul
    if not errorlevel 1 (
        echo %%I is running.
        color 0C
        echo Terminating %%I ...
        %SystemRoot%\System32\taskkill.exe /IM "%%H" >nul
    ) else (
        color 0A
        echo %%I is not running.
    )
)
color
endlocal

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • find /?
  • for /?
  • setlocal /?
  • taskkill /?
  • tasklist /?

1
投票

基于我的评论的示例:

Set ^"Processes="Sample.exe"^
 "The Sample Program.exe"^"
For %%G In (%Processes%) Do Echo %%G
Pause

显然,在

%%G
过滤器中使用
/Fi
时,只需删除那些双引号,即
%SystemRoot%\System32\tasklist.exe /NH /Fi "ImageName Eq %%~G"

请注意,以双引号开头的任何行之前都需要有前导空格

© www.soinside.com 2019 - 2024. All rights reserved.