突变后立即访问PowerShell变量

时间:2014-09-28 04:40:42

标签: powershell foreach rename-item-cmdlet

我有一个简单的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
    }
})  

2 个答案:

答案 0 :(得分:3)

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

(Get-Item $newname).Name 

答案 1 :(得分: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创建一个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
}