在PowerShell中Get-ChildItem操作行为异常

4

有一个后端SQL数据库,其中包含以UNC路径形式的“管理文件夹”。使用PowerShell中的SQL查询,我有一个循环可以逐个遍历这些文件夹,并对它们运行GCI操作,以确定它们使用了多少磁盘空间。

$managedFolder = "\\server\share\folder\subfolder"

为了回答这个问题,假设$managedFolder已经声明好了。下面是失败的命令:

$diskTrendsInitialUsage = "{0:N2}" -f ((Get-ChildItem $managedFolder -Recurse -Force | Measure-Object -Property Length -Sum).Sum / 1GB)

现在,如果我在PS控制台手动运行此命令,它是可以的,可以获取数据。但一旦将其打包成脚本,就会出现以下错误。该文件夹可以从服务器访问,因为在本地PS控制台会话中可以正常工作。
ERROR: Get-ChildItem : Invalid Path: '\\server\share\folder\subfolder'.
AddManagedFolder.psf (17): ERROR: At Line: 17 char: 42
ERROR: +         $diskTrendsInitialUsage = "{0:N2}" -f ((Get-ChildItem $managedFolder -Recurse  ...
ERROR: +                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ERROR:     + CategoryInfo          : NotSpecified: (:) [Get-ChildItem], ArgumentException
ERROR:     + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.GetChildItemCommand
ERROR:

我被难住了。

你的路径字符串中有一些特殊字符吗?例如括号等。 - Micky Balladelli
不,这只是一个普通的 UNC 路径。 - PnP
无论哪种方式,literalPath的行为都相同。 - PnP
我刚意识到你正在使用PSF文件。那是指Posh Sec Framework吗?也许可以尝试经典的Powershell PS1脚本? - Micky Balladelli
让我们在聊天中继续这个讨论。点击此处进入聊天室 - PnP
显示剩余2条评论
2个回答

7

你路径的问题在于它没有任何指示告诉PowerShell要使用哪个提供程序,因此PowerShell只使用当前的提供程序。如果当前提供程序不是文件系统提供程序,则会失败。所以你需要在路径中指定提供程序,以便让PowerShell选择正确的提供程序而不受当前提供程序的影响:

$managedFolder = "filesystem::\\server\share\folder\subfolder"

2

我猜你在运行GCI之前使用了SQL PS cmdlets,这会将提供程序路径更改为SQL:,这就是导致GCI出现问题的原因。

在运行GCI之前,请执行cd c:\将路径更改回文件系统,GCI就可以正常工作了。


谢谢Noah,我决定选择上面的选项,因为这样可以使代码更清晰,但还是非常感谢你的回答。 - PnP
不客气。他使用了我的信息来发表他的答案,但以那种方式指定肯定更加清晰。 - Noah Sparks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接