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
Windows 在批处理FOR/F命令中使用空格_Windows_Batch File - Fatal编程技术网

Windows 在批处理FOR/F命令中使用空格

Windows 在批处理FOR/F命令中使用空格,windows,batch-file,Windows,Batch File,我正在Windows中编写一个批处理文件,以测试某些进程是否正在运行,并发现以下脚本按预期工作 set EXE=uTorrent.exe FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo uTorrent is running... 但是下面的方法失败了 set EXE=Plex Media Server.exe FOR /F %%x IN ('tasklist /NH /FI "

我正在Windows中编写一个批处理文件,以测试某些进程是否正在运行,并发现以下脚本按预期工作

set EXE=uTorrent.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo uTorrent is running...
但是下面的方法失败了

set EXE=Plex Media Server.exe

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% echo Plex is running...
我很确定这是因为第二个进程名中有空格


您能解释一下修复此问题所需的更改吗?

当为/f使用
而不指定
标记=
时,默认为1个标记。使用默认的空格分隔符,这意味着它只匹配多词搜索条件中的第一个词

我尝试通过添加
“tokens=*”
并将后面的比较用双引号括起来来修复该示例,但结果只是捕获了tasklist的完整输出,而不仅仅是进程的名称

我不想在下一个用例中只使用硬代码进行修复,因此我想出了一些对您有用的不同方法。它喜欢空间,而且是动态的,所以以后在其他情况下也可以使用

命令: 输出:
当为/f
使用
且未指定
标记=
时,默认值为1个标记。使用默认的空格分隔符,这意味着它只匹配多词搜索条件中的第一个词

我尝试通过添加
“tokens=*”
并将后面的比较用双引号括起来来修复该示例,但结果只是捕获了tasklist的完整输出,而不仅仅是进程的名称

我不想在下一个用例中只使用硬代码进行修复,因此我想出了一些对您有用的不同方法。它喜欢空间,而且是动态的,所以以后在其他情况下也可以使用

命令: 输出:
这不是解决问题的最优雅的方法,但它显示了您可以如何做到这一点。我们基本上确定应用程序名称中有多少空格,然后调用相应的FOR

set EXE=Memory Compression
set count=0
for %%a in (%EXE%) do set /a count+=1
IF "%count%"=="1" FOR /F %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G" == "%EXE%" echo app is running...
IF "%count%"=="2" FOR /F  "tokens=1,2" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" echo app is running...
IF "%count%"=="3" FOR /F  "tokens=1,2,3" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I" == "%EXE%" echo app is running...
IF "%count%"=="4" FOR /F  "tokens=1,2,3,4" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I %%J" == "%EXE%" echo app is running...

这不是解决问题的最优雅的方法,但它显示了您可以如何做到这一点。我们基本上确定应用程序名称中有多少空格,然后调用相应的FOR

set EXE=Memory Compression
set count=0
for %%a in (%EXE%) do set /a count+=1
IF "%count%"=="1" FOR /F %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G" == "%EXE%" echo app is running...
IF "%count%"=="2" FOR /F  "tokens=1,2" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" echo app is running...
IF "%count%"=="3" FOR /F  "tokens=1,2,3" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I" == "%EXE%" echo app is running...
IF "%count%"=="4" FOR /F  "tokens=1,2,3,4" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I %%J" == "%EXE%" echo app is running...

以下是我的初步评论作为回答:

@Set“EXE=Plex Media Server.EXE”
@任务列表|查找/I“%EXE%”Nul&&Echo丛正在运行。。。

如果您想继续使用
For
循环方法,我建议您这样做:

@Set“EXE=Plex Media Server.EXE”
@对于/F Delims^=^“%%A In('TaskList/Fi“ImageName Eq%EXE%”/Fo:CSV/NH'
)Do@If/I“%%A”=%EXE%”Echo%%~nA正在运行。。。

这可以通过包含一个
Find
命令来进一步改进,该命令类似于
('TaskList/Fi“ImageName Eq%EXE%”/Fo:CSV/NH^ Find/I“%EXE%”)
,但我忽略了这一点,因为您对返回的输出使用了一个
If
命令。

以下是我的初步评论:

@Set“EXE=Plex Media Server.EXE”
@任务列表|查找/I“%EXE%”Nul&&Echo丛正在运行。。。

如果您想继续使用
For
循环方法,我建议您这样做:

@Set“EXE=Plex Media Server.EXE”
@对于/F Delims^=^“%%A In('TaskList/Fi“ImageName Eq%EXE%”/Fo:CSV/NH'
)Do@If/I“%%A”=%EXE%”Echo%%~nA正在运行。。。

这可以通过包含一个
Find
命令来进一步改进,该命令类似于
('TaskList/Fi“ImageName Eq%EXE%”/Fo:CSV/NH^ Find/I“%EXE%”)
,但我省略了它,因为您对返回的输出使用了
If
命令。

双引号
set“EXE=Plex Media Server.EXE”
也就是说,在这种情况下,您的if语句永远不会为真。将
set
语法更改为上述注释中的语法后,您可以尝试使用
任务列表| Find/I“%EXE%”Nul&&Echo Plex正在运行…
您需要使用
DELIMS
选项
FOR/F“delims=“%%x in…”
并在
IF
命令中的字符串比较周围加引号。双引号
set“EXE=Plex Media Server.EXE”
也就是说,在这种情况下,您的IF语句将永远不会为真。将
set
语法更改为上述注释中的语法后,您可以尝试使用
TaskList | Find/I“%EXE%”Nul&Echo Plex正在运行…
您需要使用
DELIMS
选项
FOR/F“delims=“%%x in…”
并在
IF
命令中的字符串比较周围加上引号。告诉我这里是否需要进行一些编辑或格式化。告诉我这里是否需要进行一些编辑或格式化。
set EXE=Memory Compression
set count=0
for %%a in (%EXE%) do set /a count+=1
IF "%count%"=="1" FOR /F %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G" == "%EXE%" echo app is running...
IF "%count%"=="2" FOR /F  "tokens=1,2" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" echo app is running...
IF "%count%"=="3" FOR /F  "tokens=1,2,3" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I" == "%EXE%" echo app is running...
IF "%count%"=="4" FOR /F  "tokens=1,2,3,4" %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H %%I %%J" == "%EXE%" echo app is running...