重命名-项目错误:无法重命名,因为项目不存在 [英] Rename-Item error: Cannot rename because item does not exist

查看:26
本文介绍了重命名-项目错误:无法重命名,因为项目不存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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}

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

Rename-Item:无法重命名,因为位于‘@{EXTENSION=.SQL;LineNumber=22;NAME=SP_FIRM_GetAll.SQL}’的项目不存在。

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


编辑

我还尝试了以下操作,通过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}

但是,此错误还包括:

Rename-Item : Cannot bind argument to parameter 'Path' because it is null.
At line:3 char:19
+ Rename-Item -Path $_.FullName -NewName {$_.LineNumber.ToString("1000") + ' - sp

推荐答案

As

  • 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}

这篇关于重命名-项目错误:无法重命名,因为项目不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆