Мне нужна помощь в понимании безопасности PowerShell и проблем с доступом к файлам

Я работаю с PowerShell, запустив script (с моей консоли), который включает эту строку:

$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

Сценарии и целевые файлы находятся на моем локальном диске. Я могу получить доступ к файлам в Проводнике, просматривать/редактировать/сохранять их с помощью NotePad и не устанавливать никаких ограничений разрешений. Когда я нахожусь в командной строке, я могу успешно выполнить командлет get-content в файлах на моем пути. Я могу изменить каталоги PS C:> cd C:\users\xxxxx\path\foo\bar и успешно перечислить, что там. Еще более интересно, я могу дублировать строку с ошибкой в ​​script и НЕ принимать сообщение об ошибке в командной строке.

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

Это заставляет меня подозревать, что ошибка "Permission Denied" на самом деле является чем-то другим или чем-то неопределенным, что я не знаю, как продолжить устранение неполадок. Возможно ли, чтобы у PS были разные разрешения, чем у пользователя, в котором он работает? Кто-нибудь видел это поведение раньше, и как вы решили проблему? Я уверен, что есть простое решение, которое я не знаю.

Ответы

Ответ 1

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?

Windows предоставляет Access Denied при попытке открыть каталог, как если бы он был файлом без дополнительных флагов; и .NET не передает эти флаги (для открытия папки существует несколько особых обстоятельств, но они здесь не применяются).

Ответ 2

Get-Content читать содержимое файловой папки. Пожалуйста, добавьте. после вашего пути к папке, как показано ниже.

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

Если вы хотите пройти через все папки под ним, добавьте -recurse, как показано ниже:

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

Ответ 3

Вместо этого: (согласно вашему комментарию)

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

попробуйте следующее:

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

Вы делаете foreach для строкового объекта, а не для элементов вашей папки.