0

我试图在已安装的 WebDav 驱动器上递归地计算文件夹中的文件数量。
如果路径或文件名中没有非法字符并且像我本地磁盘上的 Charm,则以下脚本有效。
但是我在那个挂载的驱动器上有很多非法字符(Linux)

我试图添加$ErrorActionPreference = "SilentlyContinue"到脚本的开头,这样即使有错误它也会继续。

所以我添加Where-Object {Test-Path $_.FullName -isValid}了捕捉非法路径的。

它仍然打破了非法的Char's..

下一个想法是从我的系统中获取非法字符并过滤包含它们的路径。

$illChars = [RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())

对我来说看起来很甜蜜,所以我可以轻松地放在-match $illChars某个地方。但是,仍然没有希望。

我认为在我什至可以检查路径之前,错误被抛出并破坏了管道Get-ChildItem $path(我对 PowerShell 脚本真的很陌生,所以不知道我是对还是错)

我的大问题是:我怎样才能捕捉到那个错误?

更新:

如果存在非法文件名,则会引发错误$Files = @(Get-ChildItem -File $_.FullName)

确切的错误信息是

Get-ChildItem : Illegales Zeichen im Pfad.
In ***** count-files.ps1:12 Zeichen:15
+             $Files = @(Get-ChildItem -File $_)
+                        ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (L:\flash\fs\trailer:String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

Get-ChildItem : Illegales Zeichen im Pfad.
In ***** \count-files.ps1:6 Zeichen:1
+ Get-ChildItem $path -recurse -exclude ".DAV" -Directory |
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (L:\flash\fs\trailer:String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand

更新 2

仍然是同样的错误,但现在脚本继续。耶。
是否可以完全消除错误?

更新 3

错误“路径格式”
和脚本再次停止
考虑使用 diruse.exe...

Get-ChildItem : Das angegebene Pfadformat wird nicht unterstützt.
In D:\workspace\videoRename\count-files.ps1:13 Zeichen:15
+             $Files = @(Get-ChildItem -File $_.FullName | where { $_.Name -notmatch $patte ...
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ChildItem], NotSupportedException
    + FullyQualifiedErrorId : System.NotSupportedException,Microsoft.PowerShell.Commands.GetChildItemCommand

Get-ChildItem : Das angegebene Pfadformat wird nicht unterstützt.
In D:\workspace\videoRename\count-files.ps1:7 Zeichen:1
+ Get-ChildItem $path -recurse -exclude ".DAV" -Directory | where { $_.Name -notma ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Get-ChildItem], NotSupportedException
    + FullyQualifiedErrorId : System.NotSupportedException,Microsoft.PowerShell.Commands.GetChildItemCommand

好的,有类似的东西GetInvalidPathChars
让我们检查路径......

更新 4.1 仍然抛出错误非法路径和文件并在路径处停止。Else(非法路径)不会被调用,即使是路径错误。

#$ErrorActionPreference = "SilentlyContinue"
$path="L:\"
$illName = "[{0}]" -f ([Regex]::Escape([String][System.IO.Path]::GetInvalidFileNameChars()))
$illPath = "[{0}]" -f ([Regex]::Escape([String][System.IO.Path]::GetInvalidPathChars()))

Get-ChildItem $path -recurse -exclude ".DAV" -Directory | where { $_.Name -notmatch $illName } | where { $_.FullName -notmatch $illPath } |
    foreach-object {
        write-host $_
        if((Test-Path $_ -isValid) -and (Test-Path $_.FullName -isValid) -and ($_.FullName -notmatch $illPath) ){
            write-host $_
            $FolderDepth = ($_.FullName.Split("\\") | measure-object).Count - 1
            $Files = @(Get-ChildItem -File $_.FullName | where {Test-Path $_ -isValid} | where { $_.Name -notmatch $illName } )
            $Size = 0
            $Files | % {$Size = $Size + $_.Length}
            New-Object PsObject -Property @{
                'Directory' = $_.FullName
                'Files' = $Files.Count
                'Depth' = $FolderDepth
                'Size' = $Size
            }
        }else {
            write-host "Error in Folder:" $_.FullName
            New-Object PsObject -Property @{
                'Directory' = $_.FullName
                'Files' = -1
                'Depth' = -1
                'Size' = -1
            }
        }
    } |
export-csv -notypeinformation -Delimiter ";" -encoding default -path test.csv
4

1 回答 1

0

我无法从这里轻松测试,但类似以下内容?

Get-ChildItem $path -recurse -Directory |
    foreach-object {
    if((Test-Path $_ -isValid) -and ($_ -notMatch ".DAV")) {

更新后,试一试...在脚本插入的顶部:

$pattern = "[{0}]" -f ([Regex]::Escape([String][System.IO.Path]::GetInvalidFileNameChars()))

然后将您填充 $files 的位置修改为:

$Files = @(Get-ChildItem -File $_.FullName  -ErrorAction SilentlyContinue | 
    ? { $_.Name -notmatch $pattern })
于 2013-04-24T19:20:04.373 回答