您没有正确使用findstr。
- 顺序很重要:开关/选项应该在参数(搜索字符串)之前(见输出
findstr /?
)
- 指定要搜索的文件的参数是必需参数(此参数允许使用通配符)。
考虑到所有这些,一个有效的findstr命令将是
findstr /s /d:"Testing" *
如果您只需要包含匹配项的文件名(而不是匹配项文件中的行内容),请使用/m
开关
findstr /s /m /d:"Testing" *
/s
如果您不需要递归搜索,也不需要开关(例如搜索C :\Testing的子目录)
要注意的另一件事是,如果您使用/d:"Testing"
,输出的第一行将是
Testing:
最终将成为数组中的第一个元素。为了解决这个问题,您可以shift
将您的数组,或者更好的是,将工作目录更改为在 Perl 中进行测试。
下面的代码片段显示了我将如何重写它
#!/usr/bin/env perl
use strict;
use warnings;
if ($^O eq "MSWin32") {
chdir("Testing");
my @results = qx'findstr /s /m "Hello" *';
local $" = ", ";
@results = map { s/^/Testing\\/; chomp; $_ } @results;
chdir("..");
print "my results \n@results\n";
}
其他注意事项(上帝,这篇文章已经太长了!):
qx'...'
有点等价于,`...`
除了两者之间的任何内容都不会被插值。
$"
是用于数组元素的分隔符,当数组插入到双引号中时 a print
or say
(一旦代码工作,更改其值以查看它的作用)
- 对
map
数组的每个元素进行一些处理
s/^/Testing\\/
为每个文件名添加前缀“ Testing**”(这样您的结果将是 **relative to C:而不是相对于 Testing)
chomp
从结果中删除尾随空白字符(例如换行符)
- 最后
$_
确保它返回修改后的文件名(而不是返回值s///
是#substitution)
您可以更进一步,在代码中参数化文件夹名称(“ Testing ”)和要搜索的字符串,甚至获取用户对这些参数的输入。但这留给读者作为练习(因为我累了,帖子已经太长了)