0

我有一个简单的 PowerShell 脚本,可以批量重命名文件,我想要一个显示“旧文件名”和“新文件名”的表输出来显示更改。假设可以完成,我如何在“ForEach-Object”循环内访问/引用新文件名?我可以刷新 $_ 的特定值吗?我不想只使用我的变量 $newname 因为我创建了它,并且由于这应该是显示文件名实际更改的输出,所以我想从系统访问文件的新名称,由脚本。

Write-Host "Old Name `t`t`t`t`t`t New Name"
Write-Host "-------- `t`t`t`t`t`t --------"

$files = Get-ChildItem -Path C:\Users\<user>\Desktop\Config
$files | % ({
    if ((!$_.PsIsContainer) -and ($_.Extension -eq '')) {
        $oldname =  $_.FullName
        $newname = "$($_.FullName).cfg"
        Rename-Item $oldname $newname

        # $_.Name still refers to the old file name without the extension
        # How do I immediately access its new name (including extension)?
        Write-Host $_.Name `t`t`t`t`t`t $newname
    }
})  
4

2 回答 2

3

您可以在 $newname 上执行 Get-Item:

(Get-Item $newname).Name 
于 2014-09-28T13:36:17.830 回答
1

我冒昧地使用哈希表和新对象稍微重写了您的脚本。

为了解释我在这里做什么,我会为你分解一下。首先,我声明了一些变量,我将在我的 foreach 循环中使用: 注意:-File 参数,所以它只会使用文件名,如果你想重命名所有内容,文件和文件夹,然后删除它。

$files = Get-ChildItem -Path "C:\Users\dha\Desktop\PS test folder" -File
$OldFiles = $files
[int]$i = "0"

然后我一个一个地获取每个文件,并在以下位置创建新名称:

$Newname = ("Blop" + "$i" + ".txt")

然后获取一个文件的文件信息,并将其通过管道传输到 rename-item here

$File | Rename-Item -NewName $Newname

$ixx 只是一个加号,因此每次 foreach 循环运行时将文件号增加一。

然后我正在编写一个带有 $Old_And_New 变量的哈希表。

最后,我正在使用 New-object 创建一个对象并输出它。

我希望这个帮助和我的解释是可以理解的。

要编写脚本:

$files = Get-ChildItem -Path "C:\Users\dha\Desktop\PS test folder" -File
$OldFiles = $files
[int]$i = "0"

foreach ($File in $files)
{
    $Newname = ("Blop" + "$i" + ".txt")
    $File | Rename-Item -NewName $Newname
    $i++

    $Old_And_New = @{
        'Old File Name' = "$OldFiles";
        'New File Name' = "$Newname"
    }

    $obj = New-Object -TypeName PSObject -Property $Old_And_New
    Write-Output $obj
}
于 2014-09-29T12:42:55.617 回答