文件夹路径中带有 GUID 的 Get-ChildItem 抛出 ParserError

Get-ChildItem with GUID in folder path throws ParserError

我在计算机 vm_remote 上使用 Powershell 2.0。这里我 运行 命令

$output = "H:\scripts\" + (get-Date -uformat %Y%m%d) + "output_files.txt"
(get-childitem G:\dum\didum\{12481b3f-12e2-4b55-a5d5-84d3b702036b} -include *.*).count >> $output

这会导致错误

Bad numeric constant: 30. At H:\scripts\count_files.ps1:4 char:40
+ (get-childitem G:\dum\didum\{30 <<<< f81b3f-12e2-4b55-a5d5-84d3b702036b} -include *.*).count >> $output
    + CategoryInfo          : ParserError: (30:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : BadNumericConstant

使用 ` 或 "" 转义 GUID 字符无效。

运行命令

Invoke-Command -Computername vm_remote -scriptblock { get-childitem "G:\dum\didum\{12481b3f-12e2-4b55-a5d5-84d3b702036b}" -recurse -include *.* -exclude *.latest }

从另一台使用远程访问的计算机(使用 Powershell 4.0)我得到以下信息:

Bad numeric constant: 30.
    + CategoryInfo          : ParserError: (30:String) [], ParseException
    + FullyQualifiedErrorId : BadNumericConstant
    + PSComputerName        : vm_remote

注意:子文件夹也包含 GUID。

如何解决这个问题?

大括号在 PowerShell 中具有特殊含义。我认为正在发生的事情是它将 GUID 视为 scriptblock 并尝试将其作为代码执行。 您应该引用该路径字符串或将其放在字符串变量中以避免此问题。我在 2.0 中遇到了同样的问题,在 4.0 中这样做没有输出。在这两种情况下都引用字符串似乎可以解决这个问题。

(get-childitem "G:\dum\didum\{12481b3f-12e2-4b55-a5d5-84d3b702036b}" -include *.*).count >> $output

虽然还不确定第二个例子。只要引用路径,它对我来说就很好用。