batch-file - CMD:FINDSTR:无法打开文件名
问题描述
我遇到了这个非常奇怪且无法解释的问题,让我困惑了很长一段时间。每次遇到这个问题时,我都无法弄清楚出了什么问题,因为它与其他变量相同。
我知道在与此相关的数千页之间可能存在一些论坛页面,我可以在其中找到我的答案,但是我找不到千分之一的页面。
所以我正在编写一个脚本来运行过滤器,它工作正常,除了这个愚蠢而顽固的变量给我错误消息。
因此,当我从名为 Test.bat 的 Bat-File 运行以下命令时(为了保持名称简短),它会在之后给出错误消息。
代码:
@ECHO off
set CNAME="RefilterMe"
SET SPT="C:\ICT\RefilterMe.txt"
SET SPT2="C:\ICT\%CNAME%.ReFiltered.txt"
SET SPT3="C:\ICT\%CNAME%.Temp.txt"
SET SPT4="C:\ICT\Refiltered"
SET SPT5="C:\ICT\%CNAME%.Programms.txt"
SET SPT6="C:\ICT\%CNAME%.Temp2Test.txt"
SET SPT7="C:\ICT\%CNAME%.Filtered.Temp.txt"
TYPE %SPT% > %SPT5%
错误:
FINDSTR: Cannot open C:\ICT"RefilterMe.Programms.txt"
在写我的问题时,我当然意识到它说的是 'C:\ICT"RefilterMe.Proper.txt"' 而不是 'C:\ICT\RefilterMe.Programms.txt'。'TYPE %SPT% > %SPT5%' 的部分直接放在可变区域/区域的后面,这很奇怪,它只发生在这一行上。
这里有一些分析信息。
测试:
复制 SPT6 并将其命名为 SPT8。这个没有问题。但是当我将其更改为 SPT5 并将 SPT5 更改为 SPT8 时,问题也在发生变化。
@ECHO off
set CNAME="RefilterMe"
SET SPT="C:\ICT\RefilterMe.txt"
SET SPT2="C:\ICT\%CNAME%.ReFiltered.txt"
SET SPT3="C:\ICT\%CNAME%.Temp.txt"
SET SPT4="C:\ICT\Refiltered"
SET SPT8="C:\ICT\%CNAME%.Programs.txt"
SET SPT6="C:\ICT\%CNAME%.Temp2Test.txt"
SET SPT5="C:\ICT\%CNAME%.Programms.txt"
SET SPT7="C:\ICT\%CNAME%.Filtered.Temp.txt"
TYPE %SPT% > %SPT5%
TYPE %SPT% > %SPT8%
我测试得越多,它就越奇怪。完全删除 SPT5 只会给出“无法打开”,而不会添加无法打开的内容。太奇怪了,我不知为何不知所措。如果我将 SPT5 从 %CNAME% 更改为 RefilterMe,它会正常工作,但我很想知道为什么会出现这个奇怪的问题,也许这个论坛上的某个人有一个想法。
编辑:根据 Compo 的要求。
代码的更大部分可以更好地帮助您理解问题。
@ECHO off
set CNAME="RefilterMe"
SET SPT="C:\ICT\RefilterMe.txt"
SET SPT2="C:\ICT\%CNAME%.ReFiltered.txt"
SET SPT3="C:\ICT\%CNAME%.Temp.txt"
SET SPT4="C:\ICT\Refiltered"
SET "SPT5=C:\ICT\%CNAME%.Programms.txt"
SET SPT6="C:\ICT\%CNAME%.Temp2Test.txt"
SET SPT7="C:\ICT\%CNAME%.Filtered.Temp.txt"
TYPE %SPT% > %SPT5%
ECHO . > %SPT2%
ECHO Cleaning Collected Entries ...
ECHO Programms > %SPT7%
::First part with possible common programms
(FindStr /IC:"Microsoft Edge" "%SPT5%" >Nul && (ECHO Edge))>> %SPT7%
(FindStr /IC:"Mozilla Firefox" "%SPT5%" >Nul && (ECHO Firefox))>> %SPT7%
更令人困惑的是,我编写的原始脚本中的变量设置将包含过滤部分。有了这个,就没有非常奇怪的错误。
WMIC bios get serialnumber > C:\SN.txt
::Extracting only the serialnumber from the txt file
TYPE C:\SN.txt | findstr /v /c:"SerialNumber" > C:\SN1.txt
FOR /f "delims=" %%x in (C:\SN1.txt) DO SET SN1=%%x
::Defining the variable for the Filename
SET "SN=%SN1: =%"
::Deleting the created Files
DEL C:\SN.txt
DEL C:\SN1.txt
::Defining Save Paths (SPT) and the Move Path (MPT) of the Tool
SET MPT="\\<IP Address>\<Path>\ICT"
SET SPT="C:\%COMPUTERNAME%.%SN%.Complete.txt"
SET SPT2="C:\%COMPUTERNAME%.%SN%.Filtered.txt"
SET SPT3="C:\%COMPUTERNAME%.%SN%.Temp.txt"
SET SPT4="C:\%COMPUTERNAME%.%SN%.Screen.txt"
SET SPT5="C:\%COMPUTERNAME%.%SN%.Programs.txt"
SET SPT6="C:\%COMPUTERNAME%.%SN%.Screen.Temp.txt"
SET SPT7="C:\%COMPUTERNAME%.%SN%.Filtered.Temp.txt"
希望这能让事情更清楚。
解决方案
这是您的用例中的一个简单批处理,说明了为什么FINDSTR
找不到包含%CNAME
在您的实际脚本中的文件:
@ECHO off
set CNAME="RefilterMe"
SET SPT="C:\ICT\RefilterMe.txt"
SET SPT2="C:\ICT\%CNAME%.ReFiltered.txt"
SET SPT3="C:\ICT\%CNAME%.Temp.txt"
SET SPT4="C:\ICT\Refiltered"
SET SPT8="C:\ICT\%CNAME%.Programs.txt"
SET SPT6="C:\ICT\%CNAME%.Temp2Test.txt"
SET SPT5="C:\ICT\%CNAME%.Programms.txt"
SET SPT7="C:\ICT\%CNAME%.Filtered.Temp.txt"
call echo "more < %SPT4%"
more < %SPT4%
call echo "more < %SPT3%"
more < %SPT3%
call echo "more < %SPT5%"
more < %SPT5%
call echo "more < %SPT8%"
more < %SPT8%
for %%i in (%SPT3%) do echo %%i
for %%i in (%SPT4%) do echo %%i
for %%i in (%SPT5%) do echo %%i
for %%i in (%SPT8%) do echo %%i
call echo "FINDSTR x %SPT3%"
FINDSTR x %SPT3%
call echo "FINDSTR x %SPT4%"
FINDSTR x %SPT4%
call echo "FINDSTR x %SPT5%"
FINDSTR x %SPT5%
call echo "FINDSTR x %SPT8%"
FINDSTR x %SPT8%
它的输出包含以'aax'、'bxb'、 'xee'_、'xff'为内容的文件:
"更多 < "C:\ICT\Refiltered"" “谢” "更多 < "C:\ICT\"RefilterMe".Temp.txt"" “xff” "更多 < "C:\ICT\"RefilterMe".Programms.txt"" “阿克斯” "更多 < "C:\ICT\"RefilterMe".Programs.txt"" “bxb” "C:\ICT\"RefilterMe".Temp.txt" “C:\ICT\重新过滤” "C:\ICT\"RefilterMe".Programms.txt" "C:\ICT\"RefilterMe".Programs.txt" "FINDSTR x "C:\ICT\"RefilterMe".Temp.txt"" FINDSTR : 无法打开 C:\ICT"RefilterMe.Temp.txt "FINDSTR x "C:\ICT\Refiltered"" “谢” "FINDSTR x "C:\ICT\"RefilterMe".Programms.txt"" FINDSTR : 无法打开 C:\ICT"RefilterMe.Programms.txt "FINDSTR x "C:\ICT\"RefilterMe".Programs.txt"" FINDSTR : 无法打开 C:\ICT"RefilterMe.Programs.txt
如您所见%SPT3%
,FINDSTR 命令将是FINDSTR x "C:\ICT\"RefilterMe".Temp.txt"
。由于它不是重定向 ( < "path"
) 中的路径,因此它们不会删除引号。FINDSTR
然后将尝试按"C:\ICT\"RefilterMe".Temp.txt"
原样查找文件,然后修剪引号,但由于存在转义引号(\"
from C:\ICT\"
),因此该引号保持原样。因此,FINDSTR 将寻找C:\ICT"RefilterMe.Temp.txt
. 而且确实找不到。
如果更改set CNAME="RefilterMe"
为set "CNAME=RefilterMe"
,您将看到脚本的行为与FINDSTR
命令的预期一致。
当变量值不是值的重要部分时,我建议您尽可能避免在cmd batch
变量值中使用引号。您应该SET
以这种方式解决所有问题。
推荐阅读
- c# - 检测到不支持的可能对象循环。这可能是由于循环或物体深度
- sql - 如何在 PostgreSQL 中使用 where 子句创建视图
- wordpress - docker-compose wordpress:最新的不同默认端口
- docker - 如何解决“apt-get install docker-ce”上的“Hash Sum Mismatch”?
- excel - 如何在每一行上重做这个宏命令(例如从第 2 行到第 500 行)
- android - 我的 android 应用程序可以以编程方式结束通话吗?
- python - Django按两类逻辑过滤
- node.js - 打字稿导入错误
- reactjs - dotnet core 3.1 反应项目上的 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY
- javascript - Javascript 装饰器