PowerShell脚本执行报错:访问C:\路径被拒绝求助
解决PowerShell脚本访问C:\根目录权限被拒绝的问题
从你给出的报错信息和脚本内容来看,核心问题很明确:普通用户默认没有Windows系统C:\根目录的写入权限——这是系统的安全限制,目的是防止随意修改系统根目录的文件,避免影响系统稳定性。你的脚本里crearFichero和escribirInfo函数都直接在C:\下创建、写入文件,自然会触发权限拒绝的报错。
下面是具体的修复方案:
1. 选择合适的写入目录
优先挑选你默认拥有写入权限的目录,比如:
- 用户个人文档目录:
$env:USERPROFILE\Documents(对应实际路径C:\Users\[你的用户名]\Documents) - 脚本所在的目录:
$PSScriptRoot(如果脚本存放在你有权限的文件夹里) - 系统临时目录:
$env:TEMP
2. 修改脚本的路径与变量作用域
除了调整文件存储路径,还要注意变量作用域问题:你在crearFichero里定义的$nombre_fichero是局部变量,默认情况下escribirInfo函数无法访问它,需要把它改成脚本级别的变量($script:nombre_fichero),让两个函数都能读取到文件名。
修改后的完整脚本如下:
# 主函数调用 main function main { crearFichero escribirInfo } function crearFichero { [CmdletBinding()] Param() Begin {} Process { $nombre_sistema = (Get-WmiObject -Class Win32_ComputerSystem -Property Name).Name $ip = Test-Connection $nombre_sistema -Count 1 | select IPV4Address $ip_replace = $ip.IPV4Address.IPAddressToString.Replace(".","_") $fecha = Get-Date -Format "MM_dd_yyyy" $ext = ".txt" $script:nombre_fichero = [System.String]::Concat($ip_replace, $fecha, $ext) # 拼接用户文档目录的目标路径 $targetPath = Join-Path -Path $env:USERPROFILE\Documents -ChildPath $script:nombre_fichero $crear_fichero= New-Item $targetPath -ItemType file } } function escribirInfo { [CmdletBinding()] Param() Begin {} Process { # 使用相同的用户文档目录路径 $targetPath = Join-Path -Path $env:USERPROFILE\Documents -ChildPath $script:nombre_fichero gwmi win32_bios | select SerialNumber, Version, Manufacturer | Add-Content $targetPath } }
关键修改说明
- 用
$script:nombre_fichero替代原来的$nombre_fichero,确保两个函数都能访问到文件名变量 - 使用
Join-Path命令拼接路径,避免手动拼接字符串时出现格式错误 - 将目标路径改为
$env:USERPROFILE\Documents,这是普通用户默认拥有写入权限的安全目录
额外提示
如果你一定要在C:\根目录下创建文件,需要以管理员身份运行PowerShell,但非常不推荐这么做——系统根目录的写入操作可能会干扰系统文件,不符合安全最佳实践。
内容的提问来源于stack exchange,提问作者Alberto Martín Rodríguez
相关产品推荐
相关产品推荐

