【问题标题】:“Exception calling ”Substring“ with ”2“ argument(s): ”startIndex cannot be larger than length of string" Using Powershell“使用“2”参数调用“子字符串”的异常:“startIndex 不能大于字符串的长度”使用 Powershell
【发布时间】:2019-11-14 21:34:09
【问题描述】:

我需要搜索目录的查找文件(它们都具有相同的名称布局)。查看文件名中的位置 9,10,11,根据 3 个字符创建一个目录,并将位置 9,10,11 的所有具有相同 3 个字符的文件移动到创建的目录中。..

代码有效,但对于它找到的每个文件,我都会收到错误

“使用“2”参数调用“子字符串”的异常:“startIndex 不能大于字符串的长度。”

所有文件的长度至少为 25 个字符。 显示的代码没有文件的移动部分,因为与错误无关。

dir -recurse| %{ 
$id = $_.Name.SubString(8,3); 
if(-not (Test-Path $id)) {mkdir $id}; }

【问题讨论】:

  • dir -recurse -> dir ???????????* -recurse
  • 谢谢,就像一个魅力.. 如果你有时间?你能解释一下为什么会这样吗?
  • 您在目录层次结构中的某个位置有名称少于 8 个字符的文件,因此来自子字符串的错误。通配符模式???????????* 只会对名称中包含 11 个以上字符的 glob 文件(? 表示正好一个字符,* 表示任何字符)
  • 感觉 PowerShell 的神总是来自荷兰 ;) 一般问题,如果在 cmets 中回答了问题,谁会写下答案以便问题得到解决?
  • 谢谢,帮了大忙。有超过 20k 个文件..

标签: powershell file search substring move


【解决方案1】:

“使用“2”参数调用“子字符串”的异常:“startIndex 不能大于字符串的长度。”

此错误表明dir -recurse 返回的文件系统项中至少有一个名称少于 8 个字符。

您可以为Get-ChildItem(又名dir)提供匹配11 个或更多字符的通配符过滤器:

Get-ChildItem -Filter ???????????* -Recurse

或者您可以使用 Where-Object 过滤掉名称中少于 11 个字符的任何项目:

# You could either use regex
Get-ChildItem -Recurse |Where-Object Name -match '.{11}'
# or inspect the Length property directly
Get-ChildItem -Recurse |Where-Object {$_.Name.Length -ge 11}

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多