PowerShell脚本问题:如何远程执行Get-ChildItem获取指定深度目录
问题解决与脚本修改
原脚本的核心问题
- 循环变量引用错误:
ForEach ($server in $serverList)里应该用$server.server调用服务器名称,而非$_.server——后者在当前循环上下文里指向的是脚本管道对象,会导致路径无效,默认访问本地机器。 - 远程目录访问方式错误:直接用服务器名作为
Get-ChildItem的路径无法访问远程机器,必须用UNC共享路径(比如\\服务器名\共享目录),或者通过Invoke-Command远程执行命令。 - 输出文件被覆盖:每次循环执行
export-csv会覆盖之前的结果,需要添加-Append参数保留所有数据。 - 目录筛选冗余:PowerShell 3.0及以上版本可以直接用
-Directory参数替代where { $_.PsIsContainer -eq $true },写法更简洁高效。
修改后的脚本方案
方案1:使用UNC路径访问(需目标服务器开启共享,如管理员共享C$)
$serverList = Import-Csv -Path C:\Users\J\Desktop\servers.csv # 先清空输出文件,避免残留旧数据 if (Test-Path "C:\Users\J\Desktop\output.csv") { Remove-Item "C:\Users\J\Desktop\output.csv" } foreach ($server in $serverList) { $serverName = $server.server # 构造UNC路径,这里以C盘管理员共享为例,可根据实际需求修改共享目录 $remotePath = "\\$serverName\C$" Get-ChildItem -Path $remotePath -Recurse -Depth 2 -Directory ` | Select-Object @{Name='ServerName'; Expression={$serverName}}, Name, Mode -Unique ` | Export-Csv -Path "C:\Users\J\Desktop\output.csv" -Append -NoTypeInformation }
方案2:使用Invoke-Command远程执行(需目标服务器开启WinRM服务)
$serverList = Import-Csv -Path C:\Users\J\Desktop\servers.csv if (Test-Path "C:\Users\J\Desktop\output.csv") { Remove-Item "C:\Users\J\Desktop\output.csv" } foreach ($server in $serverList) { $serverName = $server.server Invoke-Command -ComputerName $serverName -ScriptBlock { Get-ChildItem -Path $using:targetPath -Recurse -Depth 2 -Directory ` | Select-Object Name, Mode -Unique } -ArgumentList "C:\" ` # 指定远程机器上的根路径,可按需修改 | Select-Object @{Name='ServerName'; Expression={$serverName}}, Name, Mode ` | Export-Csv -Path "C:\Users\J\Desktop\output.csv" -Append -NoTypeInformation }
关键说明
- 两种方案都添加了
ServerName字段,方便区分不同服务器的结果。 - 方案1需要你对目标服务器的共享目录有读取权限(比如C$共享默认仅管理员可访问)。
- 方案2需要目标服务器开启WinRM服务,可通过
Enable-PSRemoting命令在远程机器上开启(需管理员权限)。 -NoTypeInformation参数用于避免CSV文件开头生成多余的类型信息行。
内容的提问来源于stack exchange,提问作者user716255
相关产品推荐
相关产品推荐

