【发布时间】:2021-09-28 14:59:41
【问题描述】:
我想下载一个 20GB 的转储文件,替换字符串并将其通过管道传输到 mysql.exe,同时它仍在 Powershell 中下载。但我在传输流时遇到问题。
如果我的文件已经下载,我可以在将文件中的字符串替换为 StdOut 的同时进行流式传输:
Get-Content 'dump.sql' | %{ $_.replace("production_db", "staging_db") }
或者,如果我在流式传输并将字符串替换到 StdOut 时也下载文件,我可以这样做:
$url = 'http://MyServer.ext/dump.sql'
& {
$myHttpWebRequest = [System.Net.WebRequest]::Create($url)
$myHttpWebRequest.Headers.Add("Authorization", "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("MyUsername:MyPassword")))
try {
$res = $myHttpWebRequest.GetResponse()
}
catch [System.Net.WebException] {
$res = $_.Exception.Response
}
if ([int] $res.StatusCode -ne 200) {
'Error: ' + [int]$res.StatusCode + " " + $res.StatusCode
} else {
$receiveStream = $res.GetResponseStream()
$encode = [System.Text.Encoding]::GetEncoding("utf-8")
$readStream = [System.IO.StreamReader]::new($receiveStream, $encode)
while (-not $readStream.EndOfStream) {
$readStream.ReadLine().replace("production_db", "staging_db")
}
$res.Close()
$readStream.Close()
}
}
但在这两种情况下,我都无法将其作为流传输到 mysql.exe。当我追加时,它将整个流首先加载到内存中,然后再传递给 mysql.exe 进程:
| & 'C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe' -u MyUsername -pMyPassword -h 127.0.0.1
如何在 Powershell 中将流通过管道传输到另一个进程?
【问题讨论】:
-
Afaik,外部命令对于 PowerShell 管道是未知的,这意味着您需要将每一行(每个 完整的 sql 命令)分别流式传输到 mysql.exe:
... |ForEach-Object { & 'C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql.exe' -u MyUsername -pMyPassword -h 127.0.0.1 } -
@iRon 恐怕这无济于事。因为为每个语句运行另一个 mysql.exe 会很慢。还有一些语句甚至相互依赖(比如设置环境变量)。
-
@nl-x 作为一种解决方法,您可以尝试使用
type dump.sql | mysql.exe命令创建一个.bat文件并使用PowerShell 脚本中的适当参数执行此.bat文件 -
我认为最好的解决方案是删除外部命令
mysql.exe并使用数据库连接器继续使用 .Net 和 com 对象。参见例如:Which driver should I install so that mysqlcommand can be run using powershell?
标签: powershell stream pipe