AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1014475
Accepted
JK_PShell_Noob
JK_PShell_Noob
Asked: 2020-04-28 12:57:13 +0800 CST2020-04-28 12:57:13 +0800 CST 2020-04-28 12:57:13 +0800 CST

在同一目录中使用 PowerShell 修改多个文件名

  • 772

当谈到 powershell 时,我是一个完全的菜鸟,但我整天都在努力解决这个问题,不知道为什么。

每天,我都会在一个目录中有一组文件。这些文件将具有不同的名称和不同的扩展名,因此它们都是唯一的。我正在尝试重命名所有这些文件以包含相同的初始文件名,然后将当前日期时间放在末尾并且不包含扩展名。下面是我所拥有的。我浏览到我的文件所在的目录,创建我的变量以获取当前日期时间并按照我想要的方式格式化。然后我发出重命名命令,它在成功完成第一个文件后总是出错,因为它试图再次编辑已经重命名的第一个文件。任何帮助将不胜感激。提前致谢。

要重命名的示例文件名

test123.dat
341test.txt
983asdf.doc

所需的最终结果,每个文件都是唯一的,以毫秒为单位,您可以在下面的文件名中看到最后 4 个数字:

abcabcp123456789d202004271552001023
abcabcp123456789d202004271552001024
abcabcp123456789d202004271552001025

我尝试了什么:

$curDateTime = Get-Date -Format yyyyMMddTHHmmssffff
Get-ChildItem *.* | Rename-Item -NewName {'abcabcp123456789d' + $curDateTime}

如果我运行 -WhatIf,它说它工作正常,没有错误。当我实际运行它时,它说: Rename-Item : 当文件已经存在时无法创建文件。

即使是几毫秒也太快了吗?在 -WhatIf 中,即使它说没有错误,所有三个文件都以相同的名称显示。无论如何。再次感谢。

我尝试运行的更新变体:

Get-ChildItem *.* | ForEach { 
    Rename-Item -Path $_.FullName -NewName "$($_.DirectoryName)\$('abcabcp123456789d')$(Get-Date -F yyyyMMddTHHmmssffff)" 
}

尝试了带括号的代码:

(Get-ChildItem *.*) | ForEach { Rename-Item -Path $_.FullName -NewName "$($_.DirectoryName)\$('abcabcp123456789d')$(Get-Date -F yyyyMMddTHHmmssffff)"}

带括号的新代码不起作用。我收到以下错误:

Rename-Item :当该文件已存在时无法创建该文件。在 line:1 char:33 + (Get-ChildItem . ) | ForEach { Rename-Item -Path $ .FullName -NewName "$($ .Dir ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ + CategoryInfo : WriteError: (F:\abc\Test\Upl...00415-b-dbo:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

powershell files rename
  • 1 1 个回答
  • 729 Views

1 个回答

  • Voted
  1. Best Answer
    Lee_Dailey
    2020-04-29T07:39:36+08:002020-04-29T07:39:36+08:00

    这以稍微不同的方式完成工作。通过将事情从管道中取出并使用正常循环,您可以获得更直接的控制,并更清楚地看到每个步骤在做什么。[咧嘴笑]

    它能做什么 ...

    • 设置常量 [源目录和文件名前缀]

    • 当您准备好对测试数据执行此操作时,会创建一些测试文件,只需删除整个#region/#endregion块。
    • 抓取文件中的$SourceDir
    • 遍历这些文件
    • 获取后缀日期戳
    • 构建新的文件名
    • 构建完整的新文件名 [包括路径]
    • 重命名文件

    没有输出。“制作测试文件”区域中的错误被抑制,但您应该看到任何其他问题的错误消息。

    测试文件相隔大约 2-15 毫秒。如果您的系统是快速 enuf,那么您可能需要在该行Start-Sleep之前添加一个命令。$Suffix也许像Start-Sleep -Milliseconds 10.

    我还在$Prefix$Suffix to make it easier for me to read. you can remove that by changing the-join '_' to-join ''` 之间添加了一个下划线。

    编码 ...

    $SourceDir = "$env:TEMP\TestingStuff"
    $Prefix = 'abcabcp123456789d'
    
    #region >>> create test files to work with
    #    when ready to do test with real data, remove this entire block
    $Null = mkdir -Path $SourceDir -ErrorAction 'SilentlyContinue'
    @('test123.dat'
        '341test.txt'
        '983asdf.doc'
        ) |
        ForEach-Object {
            $Null = New-Item -Path $SourceDir -Name $_ -ItemType 'File' -ErrorAction 'SilentlyContinue'
            }
    #endregion >>> create test files to work with
    
    $FileList = Get-ChildItem -LiteralPath $SourceDir -File
    
    foreach ($FL_Item in $FileList)
        {
        $Suffix = (Get-Date).ToString('yyyyMMddTHHmmssfff')
        $NewName = $Prefix, $Suffix -join '_'
        $FullNewName = Join-Path -Path $SourceDir -ChildPath $NewName
    
        Rename-Item -LiteralPath $FL_Item.FullName -NewName $FullNewName
        }
    

    重命名的文件...

    "C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747124"
    "C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747126"
    "C:\Temp\TestingStuff\abcabcp123456789d_20200428T102747117"
    
    • 0

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve