我正在处理批处理脚本。我有一个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也不成功。所以我感觉就在这里。也许我应该尝试以其他方式构建命令,但是作为一个新手,我不知道该怎么做。我一定很想念东西。