[英]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.