Batch file Powershell—使适用的get-child项循环解决特定的文件管理问题

Batch file Powershell—使适用的get-child项循环解决特定的文件管理问题,batch-file,powershell,automation,copy,Batch File,Powershell,Automation,Copy,Powershell V3 太长了,读不下去了(全文有一个TL;DR版本) 我对编码有点陌生,但随着时代的发展而适应,并通过解决/提高工作中的某些任务的效率来进行练习——我目前正在编写一个脚本来自动化日常文件管理任务(已经有批处理文件了,但这不是教育性的!)。我想编写一个powershell脚本,以便未来的管理员在必要时进行故障排除/调整,并包括最佳实践技术,如有意义的错误消息 这是一个有点棘手,或真的很简单,如果我错过了什么 在MS-DOS中,我想做的事情非常简单,因为目标源接受文件扩展名上的

Powershell V3 太长了,读不下去了(全文有一个TL;DR版本)

我对编码有点陌生,但随着时代的发展而适应,并通过解决/提高工作中的某些任务的效率来进行练习——我目前正在编写一个脚本来自动化日常文件管理任务(已经有批处理文件了,但这不是教育性的!)。我想编写一个powershell脚本,以便未来的管理员在必要时进行故障排除/调整,并包括最佳实践技术,如有意义的错误消息

这是一个有点棘手,或真的很简单,如果我错过了什么

在MS-DOS中,我想做的事情非常简单,因为目标源接受文件扩展名上的通配符

示例(文件结构如下):复制Group01.*RnGrp01*

我可以强制执行目录中的每一项,因为名称的开头永远不会更改,只有扩展名。。。但是,这将是太多的代码行和烦人的未来管理员,因为他们必须维护它时,额外的文件添加到目录

目录(子)项示例: 注:x、y和z是数字-这些数字将从100变为500

Group01.x.3
Group02.y.3
Group03.z.3
我需要将以Group01开头的所有文件放在一起,将Group02开头的所有文件放在一起,将Group03开头的所有文件放在一起,并将它们重命名为不同的名称,同时保持x、y和z中包含的数字相同

进一步示例-运行后的预期结果:

Group01.100.3 -> RnGrp01.100.3
Group01.101.3 -> RnGrp01.101.3
Group02.100.3 -> RnGrp02.100.3
Group02.101.3 -> RnGrp02.101.3
Group03.100.3 -> RnGrp03.100.3
Group03.101.3 -> RnGrp03.101.3
Group01.100.3 -> RnGrp01.100.3
Group01.101.3 -> RnGrp01.101.3
Group02.100.3 -> RnGrp02.100.3
Group02.101.3 -> RnGrp02.101.3
Group03.100.3 -> RnGrp03.100.3
Group03.101.3 -> RnGrp03.101.3
我尝试的几乎奏效($datestamp是一个get-date.tostring,工作完美,通过写主机测试):

----->这种方法几乎奏效了。结果是2个文件和一个错误

Rename-Item : Cannot create a file when that file already exists.
这两个文件:

.100.3
.101.3
因此它保留了扩展名,但完全删除了名称。。。这很奇怪

我试过的不起作用,我认为应该: (蛮力,有点像,但仍可根据其使用的环境进行扩展):

  • 这会引发目录错误,即使该目录有效
TL:DR版本:

MS-DOS代码:

copy Group01.* %dateformula%_RnGrp01.* 
copy Group02.* %dateformula%_RnGrp02.*
copy Group03.* %dateformula%_RnGrp03.*
进一步示例-运行后的预期结果:

Group01.100.3 -> RnGrp01.100.3
Group01.101.3 -> RnGrp01.101.3
Group02.100.3 -> RnGrp02.100.3
Group02.101.3 -> RnGrp02.101.3
Group03.100.3 -> RnGrp03.100.3
Group03.101.3 -> RnGrp03.101.3
Group01.100.3 -> RnGrp01.100.3
Group01.101.3 -> RnGrp01.101.3
Group02.100.3 -> RnGrp02.100.3
Group02.101.3 -> RnGrp02.101.3
Group03.100.3 -> RnGrp03.100.3
Group03.101.3 -> RnGrp03.101.3
不起作用:

Get-ChildItem $dest\Group01.* | foreach {Rename-Item $_ $_.Name.Replace("Group01","$datestamp_RnGrp01")}
Get-ChildItem $dest\Group02.* | foreach {Rename-Item $_ $_.Name.Replace("Group02","$datestamp_RnGrp02")}
Get-ChildItem $dest\Group03.* | foreach {Rename-Item $_ $_.Name.Replace("Group03","$datestamp_RnGrp03")}

请帮忙。

在我看来,你想要的东西更像这样:

Get-ChildItem $dest\Group*.* | 
    Rename-Item -NewName {$_.Name -replace 'Group(\d\d)',"${datestamp}_RnGrp`$1"} -Whatif
问题的一部分是,这个双引号字符串
“$datestamp\u RnGrp01”
中的变量名被解释为
datestamp\u RnGrp01
——一个完全有效的变量名。我想您希望变量名为
datastamp
。也就是说,
{}
进来了,例如,
“${datestamp}\u RnGrp0”
。这将告诉PowerShell变量名在双引号字符串中的起始和终止位置


您还可以去掉Foreach并直接将其导入重命名项。由于NewName参数是管道绑定的,因此可以通过scriptblock提供其参数,其中
$\ucode>映射到当前管道对象。

我将尝试一下!你是对的,我完全没有想到$datestamp\u RnGrp01是一个完全有效的变量名,它不存在,这完全解释了为什么我为空。此外,它是日期戳,因为它将部分日期附加到文件中。我不知道{}的语法,我真的很感激这种教育!如果它有效的话,我会把它标记为一个答案(我认为它会),谢谢!