如何检查文件包含并使用PowerShell重命名?

时间:2019-06-19 08:48:40

标签: 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"
}

3 个答案:

答案 0 :(得分:0)

您必须将其更改为

ls /brokers/ids

您仍然必须考虑$Pro = Get-ChildItem -Path C:\Users\SS\Work | Where-Object{$_.Name -like "*-A1*")} 可能有多个结果这一事实。

因此,您可能希望将其包含在$pro循环中

foreach

答案 1 :(得分:0)

像这样的事情可能使跟踪事态更容易:

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

答案 2 :(得分:0)

重命名语句中的

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

这可以解决路径问题以及多个结果。