首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell:复制和修改文件名

Powershell:复制和修改文件名
EN

Stack Overflow用户
提问于 2019-12-17 21:42:32
回答 4查看 1.9K关注 0票数 1

我需要根据分钟将文件从网络驱动器复制到本地驱动器。复制完之后,我需要按照以下要求修改文件名:

样本文件名:

Ser1-PRD-CL4$Entreprise_AG2_MyCompany-NA_DB_Name_02_LOG_20191217_094501.trn

  1. 复制35分钟前从网络目录创建的所有文件,例如\Server\Path到本地目录D:\NameofDB (我能够实现复制部分,但不知道是否有任何标志可以防止再次复制同一文件,因此无法确定如何跟踪复制文件的名称)
  2. 一旦复制,只修改所有复制文件的名称如下:

删除所有出现在单词"MyCompany“之前的字符。

b.删除下划线和单词日志"_LOG“

c.删除日期和事务号之间的下划线(_):20191217_094501

我已经从文件名中实现了"_LOG“的复制和删除,但是遇到了剩余的要求。

如有任何意见,将不胜感激:

重要注意:目标中将有其他文件被移动名称并在目标目录中修改它们的名称,而这些文件名不应该被修改。

代码语言:javascript
运行
复制
$Sourcefolder= "D:\Temp"
$Targetfolder= "D:\Temp2"
Get-ChildItem -Path $Sourcefolder -Recurse|
Where-Object {
  $_.LastWriteTime -gt [datetime]::Now.AddMinutes(-60)
}| Copy-Item -Destination $Targetfolder
Get-ChildItem -Path $Targetfolder | Rename-Item -NewName {$_.Name -replace "_LOG", ""} 
Get-ChildItem -Path $Targetfolder | Rename-Item -NewName {$_.Name -replace '^MyCompany'} #This is not working
EN

回答 4

Stack Overflow用户

发布于 2019-12-17 22:00:13

有关重复复制相同文件的第一个问题,请参见:Powershell script that can log already scanned files and ignore them on next run?

(A)

代码语言:javascript
运行
复制
Get-ChildItem -Path $Targetfolder | Rename-Item -NewName {$_.Name.substring($_.Name.indexof("MyCompany"))}

请注意,字符串区分大小写。

票数 1
EN

Stack Overflow用户

发布于 2019-12-18 00:21:05

您可以在复制时使用Copy-Item来指定一个新名称(因此以后不需要重命名)。请看下面的代码以获得以下想法:

代码语言:javascript
运行
复制
$Sourcefolder= "D:\Temp"
$Targetfolder= "D:\Temp2"
Get-ChildItem -Path $Sourcefolder -Recurse |
    Where-Object {
        $_.LastWriteTime -gt [datetime]::Now.AddMinutes(-60)
    } | ForEach-Object {
        $newname = $_.Name.Replace('_LOG','')                       # removes _LOG  
        $newname = $newname -Replace "(\d)_(\d)","$1$2"             # replace underscore between the digits
        $newname = $newname -Replace "(.*)Mycompany","MyCompany$1"  # gets rid of anything before the word "MyCompany"
        Copy-Item -Path $_ -Destination (Join-Path $Targetfolder $newname)
    }
票数 1
EN

Stack Overflow用户

发布于 2019-12-18 04:08:59

我在这里尝试使用regex展望和查找后面的https://www.regular-expressions.info/lookaround.html,所以-replace只去掉了真正匹配的部分。

代码语言:javascript
运行
复制
dir | 
copy-item -destination { 
  $_.name -replace '.*(?=MyCompany)' -replace '_LOG' -replace '(?<=\d)_(?=\d)' } -whatif

What if: Performing the operation "Copy File" on target 
Item:        /Users/js/foo/MyServer$Entreprise_AG2_MyCompany-NA_DB_Name_LOG_20191217_094501.trn 
Destination:                         /Users/js/foo/MyCompany-NA_DB_Name_20191217094501.trn".
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59382535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档