Ошибка переименования элемента: невозможно переименовать, поскольку элемент не существует - PullRequest
1 голос
/ 21 марта 2019

У меня есть следующий код 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} 'не существует.

Итак, как мне добавить свойство 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}

Однако, эти ошибки также:

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

1 Ответ

2 голосов
/ 21 марта 2019

Когда

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