簡體   English   中英

如何使用PowerShell檢查文件是否包含並重命名?

[英]How do I check file contain and rename it using PowerShell?

我在文件夾中有很多文件。 文件名看起來像這樣

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

你必須改變它

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

這樣的事情可能會更容易跟蹤發生的事情:

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

重命名語句中的$Pro僅擴展為文件名( $Pro.Name )而不是完整路徑( $Pro.FullName ),因此該語句在當前工作目錄中找不到該文件。 此外,必須在文件對象的屬性上調用Contains() (例如$_.Name.Contains('-A1') ),而不是直接在對象上。

您可以通過更改來解決問題

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

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

但是,您的代碼隱含假設Get-ChildItem將僅返回單個結果。 當語句返回多個項時,它將中斷,因為Rename-Item只接受單個源路徑。

解決該問題的更好方法是通過管道將Get-ChildItem結果直接提供給Rename-Item

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

這會解決路徑問題以及多個結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM