我一直在尝试编写一个脚本来更改特定目录中一组文件的文件编码和文件扩展名,但无济于事。到目前为止,get-content和set-content方法一直在工作,但仅适用于单个文件(尚未进行循环)。
即
get-content testdocument.txt | set-content -encoding utf8 "testdocument.xml"
#works!
即
$a = dir |
$a foreach-object |
get-content | set-content -encoding utf8 $a_fullname.xml
#doesn't work =(
我还使用rename-item cmdlet获得了成功(限制)。我可以重命名目录中的所有项目,但无法更改编码。
即
get-childitem *.txt | rename-item -newname {$_.name -replace '.txt','.xml'}
#works!
即
get-childitem *.txt | rename-item -newname {$_.name -replace '.txt','.xml'} | -encoding utf8
#doesn't work =(
非常感谢任何帮助。如果这个问题看起来微不足道,我很抱歉(一般来说,Powershell /脚本编写新手,也是第一次发布)。提前谢谢!
答案 0 :(得分:1)
对于循环,您需要将命令模块化到可以引用它们的位置并正确调用它们。在您的情况下,您需要调用“baseName”并在原始命令中附加“.xml”,而不是调用“fullName”属性。之后,只需在ForEach循环中的正确位置使用正确的变量即可使其正常工作。
$a = Get-ChildItem
ForEach ($item in $a) {
Get-Content $item.FullName | Set-Content -Encoding utf8 "$($item.Basename).xml"
}
这将允许您使用适当的编码将原始文件放在新xml文件旁边。
答案 1 :(得分:0)
要解决您的问题,您要对大多数命令使用错误的语法。我建议您查看Get-Command -Name Get-Help -Syntax
和Get-Help -Name Get-Command
(将-Name
替换为您正在使用的cmdlet。)
Rename-Item
仅用于重命名..项目。它不会改变编码。
ForEach-Object
有两个原因,即迭代集合并获取成员的值,或者对每个项目执行操作。在你的情况下:
Get-ChildItem -Path 'C:\myfiles' | ForEach-Object { # Wrapping in parens prevents filelocking (Get-Content -Path $_.FullName) | Set-Content -Path $_.FullName -Encoding UTF8 Rename-Item -NewName "$($_.BaseName).xml" -Path $_.FullName }