我正在开发一个从网络域控制器启动的 Powershell 脚本,它访问每个工作站上每个用户的本地文档文件夹。我需要做的就是列出文档目录的内容以及任何子目录的内容。初始访问运行良好,我能够读取用户文档目录的所有项目,但是一旦我开始访问子目录,我就会遇到 UnauthorizedAccessException 错误,并且我没有看到明显的原因为什么。
Add-Content : Access to the path '\\***-021.****.local\c$\Users\*******\Documents\CyberLink' is denied.
At C:\***\Powershell\DocuTriever\Docutriever v1.ps1:30 char:17
+ Add-Content -Path $path "$($item.Name)"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (\\***-021.****....ments\CyberLink:String) [Add-Content], UnauthorizedAccessException
+ FullyQualifiedErrorId : GetContentWriterUnauthorizedAccessError,Microsoft.PowerShell.Commands.AddContentCommand
(出于隐私考虑,我替换了一些名称)我可以看到错误指向 Add-Content 的使用,这意味着它仍然能够使用 Get-childitem 获取项目,但我不明白为什么命令失败。我正在访问测试路径中的名称,检查几行之前。
下面我发布了我为此使用的两个主要函数。 Get-UserDocuments 检查用户是否拥有文档,并设置输出文件。 Show-FolderContents 递归地进入文件夹,并将内容打印到 out 文件夹中。
function Get-UserDocuments($path, $user, $computerName) {
Write-Host "Working on user $($user.name)"
$documents = "\\$($computer.DNSHostName)\c$\Users\$($user.Name)\Documents"
if ((Test-Path -path $documents) -and (Test-Path -path "$documents\*")) {
$path = "$path\$($user.Name).txt"
New-Item -Path $path -ItemType file
Show-FolderContents -path $path -folder $documents
}
else {
Write-Host "$($user.name) has no local documents"
}
}
function Show-FolderContents($path, $folder) {
$items = get-childitem -path $folder | Select-Object Name
if ($items) {
Add-Content -Path $path $folder
foreach ($item in $items) {
if (Test-Path -Path "$folder\$($item.name)" -PathType Container) {
Show-FolderContents -Path "$folder\$($item.name)" -Output $path
}
else {
Add-Content -Path $path "$($item.Name)"
}
}
Add-Content -Path $path ""
}
else {
Add-Content -Path $path "$folder is empty"
}
}
有人知道我做错了什么,或者如何追踪错误的根源吗?
添加内容是引发错误的原因。 此 CMDLet 用于将数据回显到文件末尾。 (类似于 bash echo "value" >> file)
您实际上正在尝试使用“添加内容”命令将空值或“$folder 为空”写入当前的 $path 变量中。
GCI(Get-ChildItem)已经具有文件夹递归功能。 您可以使用该 CMDlet 极大地简化您的代码。