【发布时间】:2021-09-28 20:05:46
【问题描述】:
我正在尝试多线程
$var3 = Get-ItemPropertyValue $var2 -Name fullName,CreationTime,lastAccessTime,LastWriteTime,length;
将其替换为:
$var3 = forEach($file in $var2) {
start-job -name "bla" -scriptblock {Get-ItemPropertyValue $file.FullName -Name fullName,LastWriteTime,CreationTime,lastAccessTime,length} | out-null
}
其中$var2 保存通过gci 检索到的文件列表。
这适用于普通路径,但不适用于前缀为 \\?\UNC\ 的长 UNC 路径。
长路径本身适用于get-itemPropertyValue '\\?\UNC\some long path in Webdav',但一旦我将它从 start-job 放入 scriptBlock 后就不行了。
错误消息说(德语):
"Das Argument für den Parameter "Path" kann nicht überprüft werden. Das Argument ist NULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie den Befehl erneut 澳大利亚 + CategoryInfo : InvalidData: (:) [Get-ItemPropertyValue], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetItemPropertyValueCommand + PSComputerName : 本地主机
当我尝试将其与get-itemPropertyValue -LocalPath '\\?\UNC\some long path in Webdav' 绑定时,它也会失败,但会出现以下错误消息:
Das Argument kann nicht an den 参数“LiteralPath”gebunden werden,da es NULL ist。 + CategoryInfo : InvalidData: (:) [Get-ItemPropertyValue], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.GetItemPropertyValueCommand + PSComputerName : 本地主机
任何人都可以检查一下,如果这是真的,这是行不通的,或者显示一个正在运行的示例?我正在运行 PS 版本 5.1,并且必须使用此版本。
提前致谢。
【问题讨论】:
-
更改
$file > $using:file。工作范围与您当前的范围不同。 -
我还鼓励您将循环遍历的数组分成块并将该块传递给作业,而不是逐个文件传递,因为它比
foreach循环要慢得多。 -
Santiago 关于范围界定是正确的,他关于一次处理文件块的建议是可靠的,但如果您通过
Get-ChildItem获得文件列表,您不应该已经拥有数据吗?重新尝试多线程?这不是和$var3 = $var2 | Select fullName,CreationTime,lastAccessTime,LastWriteTime,length本质上一样吗? -
@TheMadTechnician,这确实解决了我的根本问题,我想知道为什么我最终会使用 get-itemPropertyValue。是否还有一个开关可以摆脱输出中的字段标题?
-
@SantiagoSquarzon,这行得通,是问题的正确答案:) 您能否详细说明范围部分并写一个答案,以便我接受?
标签: powershell unc character-limit