Как проверить содержимое файла и переименовать его с помощью PowerShell? - PullRequest
0 голосов
/ 19 июня 2019

У меня много файлов в папке. Имя файла выглядит так

12AB34-A1.txt
12AB34-AE.txt
12AB34-P1.txt
12AB34-ZS.txt

Я хочу проверить, существует ли файл в папке или нет, затем я выбираю один из файлов и переименовываю его.

Я пытался использовать этот код, но он все равно выдает ошибку.

if (Test-Path -Path "C:\Users\SS\Work\*.txt") {
    Write-Host "Job.cue File is exist"
    $Pro = Get-ChildItem -Path C:\Users\SS\Work | Where-Object{$_.Contains("-A1")}
    $Pro
    Rename-Item $Pro -NewName ($Pro.BaseName).ini
    Write-Host "Rename Finished"
}

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

Нечто подобное может упростить отслеживание происходящего:

$files = Get-ChildItem -Path c:\path\to\folder\containing\files

foreach ($file in $files){
    if ($file.BaseName -like "*-A1*"){
        Write-Host "Currently renaming: $($file.Name) "
        $newName = $file.BaseName + ".ini"
        Rename-Item $file.FullName -NewName $newName
    }else{
        #Do nothing since files doesn't have '-A1' in its name
    }
}
0 голосов
/ 19 июня 2019

$Pro в операторе переименования распространяется только на имя файла ($Pro.Name), а не на полный путь ($Pro.FullName), поэтому оператор не находит файл в текущем рабочем каталоге.Кроме того, Contains() необходимо вызывать для свойства файловых объектов (например, $_.Name.Contains('-A1')), а не для непосредственных объектов.

Вы можете решить проблему, изменив

Rename-Item $Pro -NewName ($Pro.BaseName).ini

to

Rename-Item $Pro.FullName -NewName ($Pro.BaseName).ini

Однако, ваш код подразумевает, что Get-ChildItem вернет только один результат.Он сломается, когда оператор вернет более одного элемента, потому что Rename-Item принимает только один исходный путь.

Лучшим подходом к решению проблемы является подача результатов Get-ChildItem непосредственно в Rename-Item черезpipe:

Get-ChildItem -Path 'C:\Users\SS\Work' -Filter '*-A1*' |
    Rename-Item -NewName { $_.BaseName + '.ini' }

Это решает проблему пути, а также несколько результатов.

0 голосов
/ 19 июня 2019

Вы должны изменить это значение на

$Pro = Get-ChildItem -Path C:\Users\SS\Work | Where-Object{$_.Name -like "*-A1*")}

Вы все равно должны учитывать тот факт, что $pro может иметь несколько результатов.

Так что вы можете заключить это в foreach цикл

foreach ($f in $pro)
{
    Rename-Item $f -NewName ($f.BaseName).ini
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...