2014-01-30 81 views
0

我正在处理一个脚本来格式化一个包含文本文件的目录并将其导出到CSV文件。我希望它执行搜索并替换每个文件以正确格式化,将其导出为具有相同文件名的CSV,然后移至下一个txt文件。我有搜索和替换工作,但不能解决如何保存每个文本文件的原始文件名。我究竟做错了什么?将多个文本文件保存为csv文件

$path = "H:\My Documents\EmailSaveAs\" 
$files = Get-ChildItem -Path $path -include *.txt -recurse 
echo $files 
foreach($file in $files) { 
    Foreach-Object { 
     $_ -replace "`r`n`t", "," -replace "\s`r`n", "," -replace "Bytes `r`nOut", "Bytes Out" -replace "`t", "," -replace "Idle-`r`ntimeout", "Idle-timeout" -replace ",#Date", "#Date" 
     } | 
Set-Content $path $(.BaseName + ".csv") 
} 

回答

0

试试这个:

$path = "H:\My Documents\EmailSaveAs\" 
$files = Get-ChildItem $path -include *.txt -recurse 
echo $files 
foreach($file in $files) { 
    $updatedContent = Get-Content $file.FullName -Raw | Foreach-Object { 
     $_ -replace "`r`n`t", "," -replace "\s`r`n", "," -replace "Bytes `r`nOut", "Bytes Out" -replace "`t", "," -replace "Idle-`r`ntimeout", "Idle-timeout" -replace ",#Date", "#Date" 
    } 
    $newFilename = [io.path]::ChangeExtension($file, ".csv") 
    Set-Content $newFilename $updatedContent 
} 

你的原代码访问$_当它不是在流水线上下文中执行。请注意,Get-Content上的-Raw参数在V3中是新增的。

+0

辉煌 - 完美的作品!非常感谢! – Dylan

+0

或者,不是将它读入一个变量,而是为新名称设置一个变量,然后设置内容,您可以将它输出到ala'Get-Content $ file | Foreach-Object {do stuff}。 Out-File([io.path] :: ChangeExtension($ file,“.csv”))' – TheMadTechnician

+0

@TheMadTechnician这是我最初编写它的方式,并且会在实践中这样做,但我想保留更多的窗口内的脚本。这样就不需要滚动查看解决方案的有趣部分。 –