【问题标题】:Access a PowerShell Variable Immediately After Mutation突变后立即访问 PowerShell 变量
【发布时间】:2014-09-29 21:00:08
【问题描述】:

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

【问题讨论】:

  • 使用$newname有什么问题?如果Rename-Item 没有返回错误,您可以假设它有效并且您选择的新名称是正确的。

标签: powershell foreach rename-item-cmdlet


【解决方案1】:

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

(Get-Item $newname).Name 

【讨论】:

  • 谢谢。正是我想要的。
【解决方案2】:

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

为了解释我在这里做什么,我会为你分解一下。 首先,我声明了一些变量,我将在我的 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 这里

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

【讨论】:

  • 回答您的问题了吗?或者还有什么……??
  • 是的,它确实回答了!我很抱歉没有提供足够的反馈。
猜你喜欢
  • 2021-03-16
  • 2019-05-25
  • 2019-11-08
  • 1970-01-01
  • 2013-08-18
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
相关资源
最近更新 更多