有人可以告诉我为什么这个剧本不会起作用吗?
Get-ChildItem "\\fhnsrv01\home\aborgetti\Documentation\Stage" -Filter *.EDIPROD | `
Foreach-Object{
$content = Get-Content $_.FullName
#filter and save content to a new file
$content | Where-Object {$_ -match 'T042456'} | Rename-Item `
($_.BaseName+'_834.txt')
我在这里从另一个问题中找到了这个语法并更改了环境变量。
由于某种原因,它不会更改文件的名称。文件名是
'AIDOCCAI.D051414.T042456.MO.EDIPROD'
非常感谢。
更新
感谢TheMadTechnician,我得到了一些工作。实际上很棒。图I应该与世界分享!
#Call Bluezone to do file transfer
#start-process "\\fhnsrv01\home\aborgetti\Documentation\Projects\Automation\OpenBZ.bat"
#Variable Declarations
$a = Get-Date
$b = $a.ToString('MMddyy')
$source = "\\fhnsrv01\home\aborgetti\Documentation\Stage\"
$dest = "\\fhnsrv01\home\aborgetti\Documentation\Stage\orig"
#Find all the files that have EDIPROD extension and proceed to process them
#First copy the original file to the orig folder before any manipulation takes place
Copy-item $source\*.EDIPROD $dest
# Now we must rename the items that are in the table
Switch(GCI \\fhnsrv01\home\aborgetti\Documentation\Stage\*.EDIPROD){
{(GC $_|Select -first 1) -match "834*"}{$_ | Rename-Item -NewName {$_.BaseName+'_834.txt'}}
{(GC $_|Select -first 1) -match "820*"}{$_ | Rename-Item -NewName {$_.BaseName+'_820.txt'}}
}
答案 0 :(得分:1)
像这样试试
Get-ChildItem -Filter "*T042456*" -Recurse | % {Rename-Item $_ "$_ _834.txt"}
答案 1 :(得分:1)
Get-ChildItem&{39} -Filter
有问题,我总是犹豫不决。如果由我决定,我会做这样的事情:
Get-ChildItem "\\fhnsrv01\home\aborgetti\Documentation\Stage" |
?{$_.Extension -match ".EDIPROD" -and $_.name -match "T042456"}|
%{$_.MoveTo($_.FullName+"_834.txt")}
好吧,我会把它全部放在一行上,但你可以在管道后换行,它确实让它更容易阅读,所以你有它。我很随意,抱歉。
编辑:哇,我甚至没有解决你的脚本出了什么问题。对不起,在我工作结束的时候有点心烦意乱。那么,为什么你的脚本不起作用?这就是原因:
您为所选路径提取文件和文件夹列表。这很棒,它应该工作,或多或少,我几乎不相信文件系统提供商的-Filter
功能,但无论如何,继续前进!
您获取该列表并通过ForEach循环运行它,处理与您的过滤器匹配的每个文件:
那么问题出在哪里。您正在拉取文件的内容,并逐行解析该行以尝试匹配文本而不是匹配文件名。如果您在第一个管道之后将所有内容删除到Where语句,然后将您的重命名项目放在所需名称前面-newname
,并将( )
更改为{ }
新名称,你会被设置。你的代码会起作用。所以,你的代码,如我所说的那样修改,看起来像:
Get-ChildItem "\\fhnsrv01\home\aborgetti\Documentation\Stage" -Filter *.EDIPROD |
Where-Object {$_ -match 'T042456'} | Rename-Item -NewName {$_.BaseName+'_834.txt'}
虽然我有一种感觉,你想要$ .Name而不是$ .BaseName。使用$ _。BaseName将使您(使用您的示例文件名):
'AIDOCCAI.D051414.T042456.MO_834.txt`
编辑2:真的,这是一个完全不同的问题,如何匹配多个条件,但问题就在这里,我在这里,为什么不完成它?
因此,您有多个匹配文件名的条件。说实话,这确实不会影响你的循环,它所影响的是Where语句。如果您有多个选项,您可能需要的是RegEx匹配。完全可行!我只是在这里解决Where语句(?{ }
),这不会改变脚本中的任何其他内容。
我们离开扩展部分,但我们需要修改文件名部分。使用RegEx,您可以将其替换为替代文本,方法是将其放在括号中,并使用竖线字符分割各种选项。所以它看起来像这样:
"(T042456 | T195917 | T048585)"
现在我们可以将它合并到Where语句的其余部分中,它看起来像这样:
?{$_.Extension -match ".EDIPROD" -and $_.name -match "(T042456|T195917|T048585)"}
或在您的脚本中:
Where-Object {$_ -match "(T042456|T195917|T048585)"}
编辑3:嗯,需要第一行的限定符。这让事情变得复杂了。好吧,所以我想的是获取我们的目录列表,获取具有所需扩展名的每个文件的第一行,创建一个具有两个属性的对象,第一个属性是文件的fileinfo对象,以及其他属性将是文件的第一行。等等,我想我们可以做得更好。 Switch(GCI * .EDIPROD){(get-content | select -first 1)-match 820} {Rename 820}; {blah blah -match 834} {rename 834}}。是的,这应该工作。好的,实际的脚本,而不是理论上的乱码脚本时间。这样,如果您还有其他要寻找的东西,您可以为它们添加线条。
Switch(GCI \\fhnsrv01\home\aborgetti\Documentation\Stage\*.EDIPROD){
{(GC $_|Select -first 1).substring(177) -match "^834"}{$_ | Rename-Item -NewName {"834Dailyin$b"};Continue}
{(GC $_|Select -first 1).substring(177) -match "^820"}{$_ | Rename-Item -NewName {$_.BaseName+'_820.txt'};Continue}
}
同样,如果您希望EDIPROD部分保留在文件名中,请将$_.BaseName
更改为$_.Name
。如果您尝试匹配不同的事物并根据结果执行不同的操作,那么Switch非常棒。如果你不熟悉它,你可能想要弯曲你的谷歌肌肉并检查出来。
嗯,或者我们可以在Where过滤器中找到第一行,对其运行正则表达式匹配,并根据正则表达式匹配重命名该文件。
GCI \\fhnsrv01\home\aborgetti\Documentation\Stage\*.EDIPROD | ?{(GC $_ | Select -First 1) -match "(820|834)"}|Rename-Item -NewName {$_.Name+"_"+$Matches[1]+".txt"}
然后,您只需更新Where语句,以包含您尝试匹配的任何内容。这种性感虽然不像开关那样多才多艺。但是对于简单的搜索和重命名它可以正常工作。