Мне нужна помощь в понимании безопасности 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
для строкового объекта, а не для элементов вашей папки.