使用 PowerShell 批量复制和重命名文件

2024-05-26

我正在尝试使用 PowerShell 批量复制和重命名文件。

原始文件名为AAA001A.jpg、AAB002A.jpg、AAB003A.jpg等。

我想用新名称复制文件,方法是从文件名中删除前四个字符以及句点之前的字符,以便复制的文件被命名为 01.jpg、02.jpg、03.jpg 等。

我有在 Linux 上使用 Bash 脚本的经验,但我对如何使用 PowerShell 执行此操作感到困惑。经过几个小时的反复试验,这是我所得到的最接近的结果:

Get-ChildItem AAB002A.jpg | foreach { copy-item $_ "$_.name.replace ("AAB","")" }

(它不起作用)


Note:
* While perhaps slightly more complex than abelenky's answer https://stackoverflow.com/a/42127151/45375, it (a) is more robust in that it ensures that only *.jpg files that fit the desired pattern are processed, (b) shows some advanced regex techniques, (c) provides background information and explains the problem with the OP's approach.
* This answer uses PSv3+ syntax.

Get-ChildItem *.jpg |
  Where-Object Name -match '^.{4}(.+).\.(.+)$' | 
    Copy-Item -Destination { $Matches.1 + '.' + $Matches.2 } -WhatIf

To keep the command short, the destination directory is not explicitly controlled, so the copies will be placed in the current dir. To ensure placement in the same dir. as the input files, use
Join-Path $_.PSParentPath ($Matches.1 + '.' + $Matches.2) inside { ... }.

-WhatIf previews将复制到哪些文件;删除它以执行实际复印。

  • Get-ChildItem *.jpg输出全部*.jpg文件 - 它们是否符合要重命名的文件的模式。

  • Where-Object Name -match '^.{4}(.*).\.(.+)$'然后使用regex(正则表达式):

    • ^...$锚定正则表达式以确保它与whole input (^匹配输入的开头,并且$其结束)。
    • .{4}匹配第一个4人物 (.),无论它们是什么。
    • (.+)匹配任何非空字符序列,并且由于包含在(...),捕获该序列捕获组,这反映在自动$Matches变量,可访问为$Matches.1(由于是第一个捕获组)。
    • .匹配文件扩展名之前的字符。
    • \.匹配一个literal .,由于逃脱了\- 即扩展的开始。
    • (.+)是捕获文件扩展名的第二个捕获组(没有前面的.字面意思),可访问为$Matches.2.
  • Copy-Item -Destination { $Matches.1 + '.' + $Matches.2 }然后根据从输入文件名中提取的捕获组值重命名每个输入文件。

    • 一般来说,如果可行的话,直接通过管道传输到 cmdlet 总是比通过管道传输到Foreach-Objectcmdlet(其内置别名是foreach),出于性能原因。
      In the Copy-Item上面的命令,目标路径是通过脚本块参数,对每个输入路径进行评估$_绑定到手头的输入文件。

    • 注意:以上假设副本应放置在current目录,因为脚本块仅输出一个filename, not a path.

      • 要显式控制目标路径,请使用Join-Path在 - 的里面-Destination脚本块。
        例如,确保副本始终放置在与输入文件相同的文件夹中 - 无论当前目录是什么。是 - 使用:
        Join-Path $_.PSParentPath ($Matches.1 + '.' + $Matches.2)

As for 你尝试过什么:

  • Inside "..."(双引号字符串),您必须使用$(...), the 子表达式运算符,以便嵌入应替换为其值的表达式。

  • 不管怎样,.replace ("AAB", "")(a) 由于空格字符而导致语法中断。前((你是否混淆了[string] type's .Replace() method使用 PowerShell 的-replace operator?), (b) 硬编码要删除的前缀,(c) 仅限于3字符,并且 (d) 不会删除句点之前的字符。

  • 目的地位置警告也适用:如果你的表达式有效,它只会计算为filename,这会将生成的文件放入current目录而不是与输入文件相同的目录(尽管这不会成为问题,如果您从当前目录运行命令,或者如果这是您的实际意图)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PowerShell 批量复制和重命名文件 的相关文章

  • 具有多个范围的 Powershell 整数参数验证

    我知道您可以声明一个仅接受特定范围内的值的整数参数 Parameter ValidateRange 1024 66535 Port 是否可以验证多个范围的参数输入 例如 假设我希望允许端口输入为 1 到 80 135 到 445 以及 10
  • 使用 init.ps1 和 nuget 将文件复制到解决方案文件夹

    我在使用 nuget 包的 init ps1 中的 ps 脚本时遇到问题 我试图在安装包时创建一个解决方案文件夹 然后将 dll pdbs 复制到此文件夹 并删除项目中包安装的源 dll pdbs 我能够创建解决方案文件夹 但将文件从 co
  • EWS - 访问共享日历项目/约会

    我正在尝试获取共享日历的所有项目 我已关注EWS 访问所有共享日历 https stackoverflow com questions 23766747 ews access all shared calendars 23773834 23
  • VSTS 任务组 Powershell 参数

    我使用具有四个参数的 Azure Powershell 任务内联脚本创建了 VSTS 任务组 我已将此任务组添加到发布定义并配置参数 当我尝试释放时失败并出现以下错误 2018 03 23T10 28 42 2811600Z 错误 在 C
  • Docker 在 Powershell 中登录 gcr.io

    我正在尝试使用 Windows 10 登录 Google 容器注册表JSON 密钥文件 https cloud google com container registry docs advanced authentication using
  • 查询计算机列表 - 输出上次登录用户和上次登录日期

    我正在创建一个脚本来从 txt 文件中检索所有计算机名称 然后对它们进行查询 计算机名 用户名 最后登录计算机的用户名 上次登录 使用的日期 这就是我所拥有的 Clear Host machines Get Content Path C U
  • 从 Powershell 5 移植到 Powershell 7 的函数失败,并显示“对象引用未设置到对象的实例”

    以下代码在 powershell 5 1 中按预期工作 function Get Say String Message String Voice Microsoft Irina Desktop Add Type AssemblyName S
  • 如何根据事件触发SSRS订阅?

    有没有一种方法可以让我在共享文件夹中创建文件等事件时触发 SSRS 订阅 基于时间 我们可以使用 powershell 或 C 来实现吗 SSRS 中是否有可用的开箱即用功能 尽管我认为没有 我正在使用 SQL Server 2008 R2
  • Powershell - 函数中的匹配 - 返回时获得额外的 true/false

    为什么我在这个函数的结果上得到提取 True 或 False 当我想要返回的只是邮政编码时 Function GetZipCodeFromKeyword String keyword pattern d 5 keyword match pa
  • 输入屏蔽密码

    我从其他帖子中拼凑了一个简单的例子 CmdletBinding DefaultParameterSetName Secret Param Parameter Mandatory True string FileLocation Parame
  • 如何在 PowerShell 中获取当前活动/前台窗口

    我知道这可以通过使用 alt tab 轻松完成 但创建此脚本的主要目的是自学一些 PowerShell 基础知识 我正在编写一个脚本 运行时会在 powershell 和当前前台窗口之间切换前台窗口 我读这个问题 https stackov
  • 与 PowerShell CmdLets 互操作

    我一直在编写一些利用 App V 的 PowerShell Cmdlet 的实用程序 有趣的是 微软似乎只记录了 cmdlet 而不记录 Powershell 模块背后使用的 net 程序集 现在 我熟悉了 P Invoke 和 COM I
  • Windows 计算机上出现“来自守护程序的错误响应:无法创建填充程序:OCI 运行时创建失败”错误

    我正在尝试构建一个简单的 Python 映像 然后在 Windows 上以交互方式访问容器 构建过程有效 但运行容器失败 这是 Dockerfile FROM python 3 10 4 WORKDIR app 生成文件 IMAGE scr
  • 使用 Powershell 远程安装 .msi

    我已经让他使用这个论坛上存在的代码来跟踪代码 cls computername Get Content C Users C201578 db Documents server txt sourcefile iceopsnas LNT Sof
  • 如何在 PowerShell 中键入 TAB 字符?

    Task 默认情况下 在 Windows 命令提示符中按 TAB 键将输出文件名 而在 PowerShell 中则不会执行任何操作 我希望能够在交互模式下键入 TAB 字符 而不是通过脚本 Research 我在这个网站上和通过谷歌搜索发现
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • 如何通过在原始文件名前添加序列号来重命名文件?

    伙计们 有谁知道我该怎么做 我试图通过在文件名的开头添加 1 2 3 等按数字顺序列出一些文件 同时保留文件的原始名称 这是我尝试过的代码 nr 1 Dir path C x y deneme Rename Item NewName 0 N
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil
  • Powershell 脚本无法从 SCCM 正常运行 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 使用 powershell 获取短路径

    我正在尝试在 powershell 中使用以下代码来获取短路径 对于某些文件夹它有效 对于某些人来说它不起作用 a New Object ComObject Scripting FileSystemObject f a GetFile C

随机推荐