如何在不显着增加文件大小的情况下在 PowerShell 中保存文本文件?

How do I save a text file in PowerShell without drastically increasing its size?

我有一个 PowerShell 脚本,它可以将文本添加到行中,或者在文件为空时创建行,但是它会使文件无效(它应该是一个简单的文本文件,但具有自定义扩展名“.env”) 我的代码如下所示:

$menvs = @()
$paths = @()
Get-ChildItem -Path c:\Users$env:UserName\Documents\maya\ -filter Maya.env -Recurse | % {
     $menvs = $menvs + $_.FullName
}

Foreach($fl in $menvs){
    if ((Get-Content $fl) -eq $null){
        $paths = @("MAYA_SCRIPT_PATH = P:/InProd/tools/maya/mel;P:/InProd/tools/maya/mel/nativeMaya",
                        "XBMLANGPATH = P:/InProd/tools/maya/icons",
                        "MAYA_PLUG_IN_PATH = P:/InProd/tools/maya/plugins",
                        "PYTHONPATH = P:/InProd/tools/maya/python")
    }
    else {
        $paths = Get-Content $fl
        for ($i = 0; $i -lt $paths.Length; $i++){
            if ($paths[$i] -match "MAYA_SCRIPT_PATH"){
                $paths[$i] = $paths[$i] +";P:/InProd/tools/maya/mel;P:/InProd/tools/maya/mel/nativeMaya"
            }
            if ($paths[$i] -match "XBMLANGPATH"){
                $paths[$i] = $paths[$i] +";P:/InProd/tools/maya/icons"
            }
            if ($paths[$i] -match "MAYA_PLUG_IN_PATH"){
                $paths[$i] = $paths[$i] +";P:/InProd/tools/maya/plugins"
            }
            if ($paths[$i] -match "PYTHONPATH"){
                $paths[$i] = $paths[$i] +";P:/InProd/tools/maya/python"
            }
        }
    }
    if($paths){
        $paths | Out-File $fl
        "paths updated in $fl"
    }
}

它写输入很好,我可以在任何文本编辑器中阅读它,但我注意到文件大小比我刚刚通过文本编辑器手动输入信息大 4 倍,应用程序也是这个文件根本不再读取它,它识别出文件在那里,但不再尝试读取它。

我错过了什么吗?除了 Out-File 之外,我还需要确保它是一个基本文本文件吗?

啊我找到答案了

我的 Out-File 行需要 -Encoding Default 标记。 呸

我建议你总是像这样重写你的文件:

$Content =@"
MAYA_SCRIPT_PATH =P:/InProd/tools/maya/mel;P:/InProd/tools/maya/mel/nativeMaya
XBMLANGPATH = P:/InProd/tools/maya/icons
MAYA_PLUG_IN_PATH = P:/InProd/tools/maya/plugins
PYTHONPATH = P:/InProd/tools/maya/python
"@

Get-ChildItem -Path "c:\Users$env:UserName\Documents\maya\" -file -filter Maya.env -Recurse | %{
    Set-Content -Path $_.FullName -Value $Content -Encoding Default
    "paths updated in " + $_.FullName 
}