4

我有一个在文件中执行正则表达式替换的函数。问题是它会在它接触的每个文件的开头添加一个字符(0x00)(即使是那些它找不到匹配的文件!)。由于我正在编辑csproj文件,MSBuild 给了我这个错误:

error MSB4025: The project file could not be loaded. '.', hexadecimal value 0x00, is an invalid character. Line 2, position 1.

这是我的功能:

function fileStringRegExReplace ([string] $fileToChange, [string] $oldString, [string] $newString) {
    echo "f" | xcopy "$fileToChange" "$fileToChange.og.cs" /Y /Q

    $file = Get-Content "$fileToChange.og.cs" | 
        Foreach-Object {
            $_ -replace $oldString, $newString
        } |
        Out-File "$fileToChange"

    Remove-Item "$fileToChange.og.cs"
}

如何替换我想要的行而不更改文件的任何其他部分?

4

4 回答 4

6

听起来像是在文件开头写了一个BOM。-Encoding ASCII您可以使用参数 on将编码设置为 ASCII(没有 BOM)out-file

于 2013-04-15T21:28:10.010 回答
2

Out-File的默认编码是UTF-16Unicode的 Windows 语言。只写ASCII集合中的字符时,UTF-16基本上有在每个字符前面加一个字节的效果。这解释了为什么 Visual Studio 抱怨字节。0x000x00

您尝试修改的 csproj 文件的 XML 声明为UTF-8,因此请使用-Encoding UTF8Out-File 中的选项。

不要使用 ASCII 编码,一旦 csproj 文件中包含非 ASCII 字符,这将导致问题。

于 2016-08-25T10:21:32.163 回答
1

我遇到了同样的问题,在使用 aForEach替换文本后,我遇到了问题。

对于我的解决方案,我只想找到最后一个</Target>并添加 append another <Target></Target>

我尝试了这种方法,并且由于某种原因文件大小增加了一倍,并且0x00错误也失败了Line: 2, Position: 1

我必须将此解决方案归功于@Matt,因为我自己可能不会弄清楚正则表达式:https ://stackoverflow.com/a/28437855/740575

这让我可以优雅地不使用这种ForEach方法。你应该在这个解决方案的某个地方找到你的答案。

$replaceVar = "<Target> ... </Target" ;
# NOTE: -Raw will read the entire file in as a string, without doing that
#       everything gets read in as an array of lines
$file = Get-Content file.csproj -Raw ;
$newFile = $file -replace "(?s)(.*)</Target>(.*)", "$1$replaceVar$2" ;

# csproj is UTF8
$newFile | Out-File -Encoding UTF8 "new.csproj" ;

解决方案适用于 Visual Studio 和msbuild.exe.

于 2015-03-03T17:17:11.813 回答
0

尝试用 set-content 替换 out-file。

于 2013-04-15T21:05:09.810 回答