CMD:FINDSTR:无法打开文件名

VarmintLP

我遇到了这个非常奇怪且无法解释的问题,这让我困惑了很长一段时间。每次遇到这个问题时,我都无法弄清楚出了什么问题,因为它与其他变量的情况相同。

我知道可能有一些论坛页面夹在与此相关的数千页之间,我可以在其中找到我的答案,但是我找不到千分之一。

所以我正在编写一个脚本来运行过滤器,它运行良好,除了这个给我错误消息的愚蠢而顽固的变量。

因此,当我从名为 Test.bat 的 Bat 文件中运行以下命令时(以保持名称简短),它会在之后给出错误消息。

代码:

@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"

希望这能让事情变得更清楚。

Zilog80

这是您的用例中的一个简单批处理,说明为什么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'作为内容:

"more < "C:\ICT\Refiltered"" 
"xee" 
"more < "C:\ICT\"RefilterMe".Temp.txt"" 
"xff" 
"more < "C:\ICT\"RefilterMe".Programms .txt"" 
"aax" 
"more < "C:\ICT\"RefilterMe".Programs.txt"" 
"bxb" 
"C:\ICT\"RefilterMe".Temp.txt" 
"C:\ICT\Refiltered" 
"C:\ICT\"RefilterMe".Programms.txt" 
"C:\ICT\"RefilterMe".Programs.txt" 
"FINDSTR x "C:\ICT\"RefilterMe".Temp.txt"" 
FINDSTR :可以' t 打开 C:\ICT"RefilterMe.Temp.txt 
"FINDSTR x "C:\ICT\Refiltered"" 
"xee" 
"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这种方式解决所有问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法打开“文件名”:找不到文件(文件:<错误的文件路径>/文件名)

文件名太长,Windows无法打开文件

awk:无法打开“文件名”进行输出(打开的文件太多)

修复 findstr 以忽略与路径匹配的文件名

mongoimport无法打开文件,“文件名,目录名或卷标签语法不正确”

cmd类型,不打印文件名

cmd在文件名中间插入文本

通过CMD获取文件名

forfiles / for cmd 中的长文件名

文件错误(文件名,“ r”,编码=编码):无法打开连接

Python:无法打开“文件名”:[Errno 2]没有这样的文件或目录

文件无法在 Chrome 或 Firefox 中打开,URL 中的文件名更改为“0”

尽管可以打开文件,但由于“文件名或编号错误”而无法删除

我无法在 vba 上打开带有部分文件名的文件

如何打开用户输入的文件名?

打开:无效模式或文件名

Windows操作系统无法打开在Linux上可用的文件名

无法通过“上下文菜单»编辑”以文件名中的逗号打开Powershell脚本

即使我可以打印出完全相同的文件名,Perl也无法找到并打开现有文件的文件名

无法打开源文件“所有 cpp 头文件”并且全局范围没有“某些文件名”错误

使用cmd将文件日期附加到文件名

在可执行目录中打开文件名*文件名部分未知的文件

htaccess 重写 - 无法识别文件名

PutMongoRecord 无法访问文件名

Multer 无法获取文件名

无法从文件名探测 mimetype

无法更改Zookeeper日志文件名

无法在 gridview 中打印文件名

Applescript 无法设置文件名