我试图在已安装的 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