Powershell Set-Content在文件末尾创建新的空行

时间:2018-08-22 08:12:43

标签: powershell replace

我正在处理批处理脚本。我有一个SQL文件,我想替换一些字符串。我使用这样的PowerShell 5.1 -replace运算符实现了这一点:

powershell -Command "(Get-Content 'myfile.sql') -replace 'abc', 'xyz' | Set-Content 'myfile.sql'"

我注意到编辑后的文件结尾处有一个新的空行。就我而言,这很烦人,因为我还使用了copy命令将此文件合并到另一个文件以创建新脚本。当我尝试在SSMS中执行此空行时会产生错误。

我尝试了不同的方法来防止最后一次创建空行,例如Out-File而不是Set-Content,但没有任何变化。我也尝试使用.NET命令:

powershell -Command "[system.io.file]::WriteAllText('myfile.sql',((Get-Content 'myfile.sql') -replace 'abc', 'xyz' ))"

但是这一步将文件转换为一行,这甚至更糟,因为SQL脚本包含注释。所以我的文件就从这里来:

Line 1 -- comment 1
Line 2 -- comment 2

对此:

Line 1 -- comment 1 Line 2 -- comment 2

仅使脚本的第一行可执行。当然,不能删除评论。

那么,您对此有何看法?是否有特定的选项可添加到PowerShell命令中以防止最后一次创建空行(在我看来,-NoNewLine是不正确的)?是否应该将PowerShell命令更改为另一个批处理命令?也不能使用C程序!

编辑1:根据评论,我提到this post可能会给我带来答案。

我尝试了-NoNewLine选项:

powershell -Command "(Get-Content 'myfile.sql') -replace 'abc', 'xyz' | Set-Content -NoNewLine -Force 'myfile.sql'"

哪个呈现:

Line 1 -- comment 1 Line 2 -- comment 2

然后在这里行不通。我试图添加-join运算符。我必须将双引号替换为单引号以使其适合我的Powershell -Command

powershell -Command "(Get-Content 'myfile.sql') -replace 'abc', 'xyz' -join '`n' | Set-Content -NoNewLine -Force 'myfile.sql'"

现在,结果包括一个'n'字符串:

Line 1 -- comment 1 `n` Line 2 -- comment 2

然后,我尝试使用-join选项来完成r

powershell -Command "(Get-Content 'myfile.sql') -replace 'abc', 'xyz' -join '`r`n' | Set-Content -NoNewLine -Force 'myfile.sql'"

哪个给:

Line 1 -- comment 1 `r`n`r` Line 2 -- comment 2

现在没有比这更好的了。作者还使用了-Raw中的Get-Content运算符,也许我应该做同样的事情,但是在命令中将其定位失败了:

powershell -Command "(Get-Content 'myfile.sql' -Ram(?)) -Raw(?) -replace 'abc', 'xyz' -Raw(?) | Set-Content 'myfile.sql'"

这两个位置均触发了错误。我还尝试将所有命令都嵌入括号中并添加-Raw,但没有成功。使用.NET也不成功。所以我感觉就在这里。也许我应该尝试以其他方式构建命令,但是作为一个新手,我不知道该怎么做。我一定很想念东西。

0 个答案:

没有答案