我目前正在学习LPTHW Ex 46。在他的视频教程中,Zed完成了以下命令:
使用grep -r "NAME" *
在文件中查找NAME。
使用find . -name "*pyc" -print
查找扩展名以.pyc结尾的所有文件。
不幸的是,上面的代码在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项,我找不到类似的功能。
答案 0 :(得分:1)
grep
和find
是Unix / Linux shell命令。除非您安装Windows端口,否则他们不会在PowerShell中工作。
正如您已经发现的那样,Select-String
是grep
的PowerShell等价物。但是,它不会单独递归,因此您必须将其与Get-ChildItem
结合才能模拟grep -r
:
Get-ChildItem -Recurse | Select-String -Pattern 'NAME'
为了模仿find
,您需要将Get-ChildItem
与Where-Object
过滤器结合使用:
Get-ChildItem -Recurse | Where-Object { $_.Extension -eq '.pyc' }
PowerShell cmdlet可以使用别名来帮助管理员避免大量输入(因为PowerShell语句往往相当冗长)。有几个内置别名,例如ls
的{{1}}或dir
,Get-ChildItem
的{{1}}或?
。您还可以定义自己的别名,例如where
。只要截断的参数名称对于cmdlet保持唯一,就可以缩短参数名称。当cmdlet允许位置参数时,甚至可以完全省略它们。
使用以上所有内容,您的两个PowerShell语句可以简化为以下内容:
Where-Object
但请注意,别名和缩写主要用作控制台使用的增强功能。对于PowerShell脚本,您应始终使用完整表单,不仅是为了提高可读性,还因为别名可能因环境而异。你不希望你的脚本因为他们由其他人运行而破坏。