【问题标题】:Rename-Item error: Cannot rename because item does not exist重命名项目错误:无法重命名,因为项目不存在
【发布时间】:2019-03-21 10:38:58
【问题描述】:

我有以下 powershell 代码,它试图重命名文件夹中的所有 SQL 文件,为每个文件添加一个唯一的前缀,例如第一个前缀是 '1001 - sp - C - ':

gci -Path 'C:\FolderToLookIn' -Exclude "1*" | ForEach-Object {
    New-Object PSObject -Property @{
        'LineNumber' = $linenumber;
        'Name'       = $_.Name;
        'Extension'  = $_.Extension
    };
    $linenumber++
} | Where-Object {
    $_.Extension -eq ".sql"
} | Rename-Item -NewName {$_.LineNumber.ToString("1000") + ' - sp - C - ' + $_.Name}

但是,这会产生如下错误:

重命名项目:无法重命名,因为项目位于 '@{Extension=.sql;行号=22; Name=sp_Firm_GetAll.sql}' 不存在。

那么,如何添加LineNumber 属性并将其用作Rename-Item 命令中的前缀而不丢失项目本身?


编辑

我还尝试了以下方法,通过FullName 并在Rename-Item 中使用它:

gci -Path 'C:\FolderToSearch' -Exclude "1*" | ForEach-Object {
    New-Object psObject -Property @{
        'LineNumber' = $linenumber;
        'Name'       = $_.Name;
        'Extension'  = $_.Extension;
        'FullName'   = $_.FullName
    };
    $linenumber++
} | Where-Object {
    $_.Extension -eq ".sql"
} | Rename-Item -Path $_.FullName -NewName {$_.LineNumber.ToString("1000") + ' - sp - C - ' + $_.Name}

但是,这个错误也有:

重命名项目:无法将参数绑定到参数“路径”,因为它为空。 在行:3 字符:19 + 重命名项目 - 路径 $_.FullName -NewName {$_.LineNumber.ToString("1000") + ' - sp

【问题讨论】:

  • Rename-Item 没有 FullName 参数 - 在你的最后一个例子中,更改 'FullName'= $_.FullName -> 'LiteralPath'= $_.FullName 代替
  • @MathiasR.Jessen 谢谢,我尝试将新对象中的属性名称从 FullName 更改为 LiteralPath 并在 rename-item 部分中将 $_.FullName 更新为 $_.LiteralPath,但这仍然返回错误“重命名项目:无法将参数绑定到参数“路径”,因为它为空。”
  • 没有。当您从管道读取输入时,完全从该语句中删除 -Path 参数及其参数。
  • 为什么不首先将 gci 限制为 *.sql 文件而不是使用 Where-Object?当您排除 1* 时,在连续运行时会生成相同的前缀 1000 - sp - C - (因为旧名称是唯一的)
  • @AnsgarWiechers 抱歉,我还没到呢!我现在在没有路径的情况下尝试了这个,因为它在我第一次尝试时没有路径,但是按照 Mathias 的建议将 FullName 更改为 LiteralPath,但返回的错误类似于我收到的第一个错误。如果有人有一个工作示例,他们可以发布作为对此的答案,将不胜感激。谢谢

标签: powershell powershell-3.0


【解决方案1】:

作为

  • Rename-Item 接受管道输入,ForEach 不是必需的,并且
  • 使用[Ref],您可以在-NewName {scriptblock} 内增加一个计数器

$Folder = 'C:\FolderToLookIn'

$Count = [ref] 0
Get-ChildItem -Path $Folder -Filter *.sql -File |
  Where-Object Name -NotMatch '^\d{4} - sp - C - ' | 
    Rename-Item -Newname {"{0:1000} - sp - C - {1}" -f $Count.Value++,$_.Name}

包含 A.sql、B.sql、C.sql 的示例文件夹将具有以下结果:

> gci *.sql -name
1000 - sp - C - A.sql
1001 - sp - C - B.sql
1002 - sp - C - C.sql

首先从现有文件中获取最后/最大数字或将 1000 设置为开始的变体。

$Count = [Ref][math]::Max(1000,
    [int](Get-ChildItem -Path $Folder -Filter *.sql -File|
            Where-Object Name -match '^(\d{4}) - sp - C -' | 
            Select-Object @{n='Count';e={$Matches[1]}} -Last 1).Count)

Get-ChildItem -Path $Folder -Filter *.sql -File |
  Where-Object Name -NotMatch '^\d{4} - sp - C - ' | 
    Rename-item -Newname {"{0:D4} - sp - C - {1}" -f ++$Count.Value,$_.Name}

【讨论】:

  • 正是我正在寻找的和更简洁的解决方案,非常感谢!
  • 感谢@LotPings,这非常有用。请查看我的跟进question,因为我正在努力理解所使用的一些代码。
猜你喜欢
  • 2021-04-07
  • 2019-12-03
  • 2015-02-28
  • 2011-12-23
  • 2010-12-17
  • 2011-01-03
  • 2014-05-14
  • 2016-08-03
相关资源
最近更新 更多