我需要帮助理解PowerShell安全和文件访问问题。

22

我正在使用PowerShell工作,在控制台中运行一个包含以下代码的脚本:

$inpath = "C:\users\xxxxx\path\foo\bar"

我一直遇到这个错误:

Get-Content : Access to the path 'C:\users\xxxxx\path\foo\bar' is denied.
At C:\users\xxxxx\path\foo\testscript.ps1:53 char:12
+ Get-Content <<<<  $txtfile | Get-WordCount -Exclude (Get-Content c:\temp\exclude.txt) | select -First 15
    + CategoryInfo          : PermissionDenied: (C:\users\xxxxx\path\foo\bar:String) [Get-Content], UnauthorizedAcc
   essException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

这些脚本和目标文件都位于我的本地驱动器上。我可以在资源管理器中访问这些文件,使用记事本查看/编辑/保存它们,并且没有设置任何权限限制。当我使用命令行时,可以在我的路径上成功运行get-content cmdlet来处理文件。我可以更改目录 PS C:> cd C:\users\xxxxx\path\foo\bar 并成功列出其中的内容。更有趣的是,我可以复制脚本中出现错误的那一行,并在命令行上不会收到错误提示。

PS C:\users\xxxxx\path\foo> $inpath = "C:\users\xxxxx\path\foo\bar"
PS C:\users\xxxxx\path\foo>

这让我怀疑“权限被拒绝”错误实际上是其他什么问题,或者是足够模糊,以至于我不知道如何进行故障排除。PS是否可能具有与其运行的用户不同的权限?有人见过这种行为吗?你是如何解决这个问题的?我相信有一个我不知道的简单解决方案。


你是如何运行脚本的?使用了什么权限?是在任务计划程序中吗?如果从控制台调用脚本,脚本是否能正常工作? - Frode F.
你想读取哪个文件?(完全有可能可以访问一个文件夹,但不能访问它所包含的文件。) - Richard
@Graimer - 脚本正在从控制台运行;不确定脚本具有什么权限,如何查看或设置它们(如果与我的用户权限不同)。它不能作为脚本从控制台运行(例如,PS c:\foo> .\script.ps1),但如果我将单独的行作为控制台提示输入,则可以工作。 - dwwilson66
@Richard - 最终,我正在尝试读取$inpath中的所有文件。现在,我有一个名为“testfile.txt”的单个ASCII文件。我无法从脚本访问此文件,但可以在手动输入命令时从PS控制台提示符中读取其内容。 - dwwilson66
3个回答

45
Get-Content:无法访问路径'C:\ users \ xxxxx \ path \ foo \ bar'。
位于C:\ users \ xxxxx \ path \ foo \ testscript.ps1的第53个字符

这条路径看起来不像是文件,而是一个文件夹。

您确定将文件名附加到文件夹并将其传递给Get-Content吗?

如果您尝试打开一个目录作为文件而没有传递额外的标志,则Windows会返回“拒绝访问”错误; .NET不会传递这些标志(有一些特定情况下打开文件夹的情况,但本例不适用)。


你是正确的,$inpath 是一个路径。这个脚本使用 foreach 遍历该路径... foreach ($doc in $inpath { do-function } )。我将这段代码从之前能够完美工作的脚本中进行了重用... - dwwilson66 - dwwilson66
@dwwilson66:我不是在谈论一个变量:看一下错误信息,它显示的路径是传递给Get-Content的路径,但无法打开。 - Richard
1
我很想知道需要哪些额外的标志。 - DarioP

4

Get-Content读取文件内容而不是文件夹。请在您的文件夹路径后面添加“.”,如下所示。

Get-Content "D:\Logs\*.*" | ?{($_|Select-String "test")}

如果您想遍历其下所有文件夹, 则像下面这样添加-recurse:
Get-Content "D:\Logs\*.*" -Recurse | ?{($_|Select-String "test")}

Get-Content 命令没有 -Recurse 参数。 - dzampino

0

不要这样做:(根据您的评论)

foreach ($doc in $inpath) { do-function }

尝试一下这个:
foreach ($doc in (gci $inpath)) { do-function }

你正在对一个字符串对象进行foreach,而不是你的文件夹项。


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