powershell - PowerShell获取 - ChildItem :过滤csv文件并递归操作

我创建了一个简短的PowerShell脚本,将csv文件从Unicode转换为UTF-8编码,

我正在尝试在子目录中运行脚本,问题是,创建的csv文件没有内容。如果脚本在与csv文件相同的目录中运行,这个问题不会出现,


 Get-Content -Encoding Unicode $_ | Out-File -Encoding UTF8


 Get-ChildItem -Recurse | ForEach-Object {Get-Content -Encoding Unicode $_ | Out-File -Encoding UTF8"UTF8$_"}



时间:

Get-ChildItem接受-Filter参数,对于文件来说,它是简单的通配符模式,这将允许你仅将cmdlet限制为CSV文件:


Get-ChildItem -Filter *.csv



若要处理子目录,还可以使用-Recurse开关,


Get-ChildItem -Filter *.csv -Recurse



现在,我从不确定$_通过管道传递不同的对象时如何变化,因此我可能不会做下一步:

每个文件对象都需要按如下方式处理:

  • 将它分解为路径和文件名: $filepath = $_.PSParentPath; $filename = $_.PSChildName
  • 加载CSV :Import-CSV -Path $_
  • 使用正确的编码输出新的CSV : Export-CSV -Path ("{0}UTF8{1}" -f $filepath,$filename) -Encoding UTF8

所以,把它们放在一起:


Get-ChildItem -Filter *.csv -Recurse | ForEach-Object { $filepath = $_.PSParentPath; $filename = $_.PSChildName; Import-CSV -Path $_ | Output-CSV -Encoding UTF8 -Path ("{0}UTF8{1}" -f $filepath,$filename) }



如果在Get-ChildItem的末尾指定文件扩展名,这将只获取带有.csv扩展的文件。

通过在Out-File中指定文件路径,把它发送到指定的目录。


Get-ChildItem -Path C:folder*.csv -Recurse | ForEach-Object {Get-Content -Encoding Unicode $_ | Out-File -FilePath C:Folder -Encoding UTF8"UTF8$_"}



根据原始编码(还有BOM的存在),你可能需要在输入端指定编码。


ForEach($Csv in (Get-ChildItem -Filter *.csv -Recurse -Exclude UTF8*)){


 Get-Content $Csv.FullName | 


 Set-Content -Path {Join-Path $Csv.Directory ("UTf8"+$Csv.Name)} -Encoding UTF8


}



更改使用ForEach($x in $y){}循环的编码,或者在Get-ChildItem上使用PipelineVariable的ForEach-Object{}循环,


Get-ChildItem *.csv -Recurse -PipelineVariable File | ForEach-Object{


 Set-Content -Value (Get-Content $File.FullName -Encoding Unicode) -Path {Join-Path $File.Directory"UTF8$($File.Name)"} -Encoding UTF8


}



...