在/中搜索文件中的文本

时间:2015-12-31 08:28:56

标签: powershell-v2.0

我目前正在学习LPTHW Ex 46。在他的视频教程中,Zed完成了以下命令:

  1. 使用grep -r "NAME" *在文件中查找NAME。

  2. 使用find . -name "*pyc" -print查找扩展名以.pyc结尾的所有文件。

  3. 不幸的是,上面的代码在Windows PowerShell上不起作用。我可以知道他们的Windows PowerShell等价物是什么吗?

    根据我的搜索,第1项可以替换为Select-String。但是,它不如我们只能搜索特定文件而不是目录。例如,虽然这可行:

    Select-String C:\Users\KMF\Exercises\Projects\gesso\gesso\acrylic.py -pattern "NAME"
    

    这不会:

    Select-String C:\Users\KMF\Exercises\Projects\gesso -Pattern "NAME"
    

    ,它会出现以下错误

      

    Select-String:无法读取文件C:\ Users \ KMF \ Exercises \ Projects \ gesso:访问路径' C:\ Users \ KMF \ Exercises \ Projects \ gesso'被拒绝。

    对于第2项,我找不到类似的功能。

1 个答案:

答案 0 :(得分:1)

grepfind是Unix / Linux shell命令。除非您安装Windows端口,否则他们不会在PowerShell中工作。

正如您已经发现的那样,Select-Stringgrep的PowerShell等价物。但是,它不会单独递归,因此您必须将其与Get-ChildItem结合才能模拟grep -r

Get-ChildItem -Recurse | Select-String -Pattern 'NAME'

为了模仿find,您需要将Get-ChildItemWhere-Object过滤器结合使用:

Get-ChildItem -Recurse | Where-Object { $_.Extension -eq '.pyc' }

PowerShell cmdlet可以使用别名来帮助管理员避免大量输入(因为PowerShell语句往往相当冗长)。有几个内置别名,例如ls的{​​{1}}或dirGet-ChildItem的{​​{1}}或?。您还可以定义自己的别名,例如where。只要截断的参数名称对于cmdlet保持唯一,就可以缩短参数名称。当cmdlet允许位置参数时,甚至可以完全省略它们。

使用以上所有内容,您的两个PowerShell语句可以简化为以下内容:

Where-Object

但请注意,别名和缩写主要用作控制台使用的增强功能。对于PowerShell脚本,您应始终使用完整表单,不仅是为了提高可读性,还因为别名可能因环境而异。你不希望你的脚本因为他们由其他人运行而破坏。