PowerShell使用select-string访问文件-访问被拒绝

3

我有一个简单的 myscript.ps1,用于从文件中提取URL,该脚本来自于这个教程

$input_path = 'd:\myfolder\*'
$output_file = 'd:\extracted_URL_addresses.txt'
$regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?'
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

我以管理员身份运行PowerShell,然后输入:

D:/myscript.ps1

但是对于d:\myfolder内的大多数路径,我得到了以下信息:

select-string : The file D:\myfolder\templates cannot be read: Access to the path 'D:\myfolder\templates' is denied.

这个文件夹是通过WinSCP从FTP服务器上复制的。我试图进入文件夹属性并取消"只读"框, 然后应用,但每次重新进入属性时,它又变成了"只读"(我不确定这是否与问题有关)。

我使用的操作系统是Windows 10。


3
看起来 D:\myfolder\templates 是一个文件夹,而不是适用于 Select-String 的文件。 - user6811411
您能否浏览到 D:\myfolder\templates 中的文件,如果您看到了文件,您能否打开它们?这听起来像是 ACL 问题。 - TheMadTechnician
@TheMadTechnician 是的,我能够打开并浏览这些文件夹,没有任何问题。 - PolGraphic
如果有的话,我不知道你文件夹的内容。在gci命令中添加“-File”参数和/或提供扩展名即可。 - user6811411
2个回答

0

针对@LotPings的评论,您可以使用Get-ChildItem命令的-File参数来获取D:\myfolder文件夹中的文件。这样,您就不需要将目录传递给Select-String命令。

$input_path = 'd:\myfolder'
$Files = Get-ChildItem $input_path -File | Select-Object -ExpandProperty FullName
Foreach ($File in $Files) {
    $output_file = 'd:\extracted_URL_addresses.txt'
    $regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?'
    select-string -Path $file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
}

0
  • 由于 $input 是一个自动变量,我不会使用它 - 甚至不会将其用作变量名称的一部分。
  • 您不需要两个堆叠的ForEach-Object,而是应使用$_.Matches.Values
  • 在路径中使用文件扩展名可能最终可以避免错误
  • 在此网页的副本上使用以下脚本可以完美运行,但有很多重复项,因此我会添加|Sort-Object -Unique

$FilePath = '.\*.html'
$OutputFile = '.\extracted_URL_addresses.txt'
$regex = '([a-zA-Z]{3,})://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)*?'
Get-ChildItem -File $FilePath |
  Select-String -Pattern $regex -AllMatches | 
    ForEach-Object { $_.Matches.Value } |Sort -Unique > $OutputFile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接