gpt4 book ai didi

c# - 在远程 powershell session 期间复制文件 c# runspace

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:42 27 4
gpt4 key购买 nike

我需要使用 powershell 将文件从 Azure VM 上的某个位置复制到我的本地计算机。例如,虚拟机上的 C:\tmp 到本地计算机上的 C:\tmp

该应用程序是使用系统自动化的 C#。目前我使用的是该方法。

    using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline(//Some SQL that pulls files from database to C:\tmp);
var results = pipeline.Invoke();
}

我现在使用的powershell只是返回每个文件的get-content,然后循环返回到c#,每次都写入文件。然而,这是非常低效的。

最佳答案

这是正确的想法,但是这样做时对文件进行分块会更有效。 Powershell 目前没有本地方法来执行此操作,因此您必须编写一些代码。有两个部分,远程 powershell 部分用于对服务器上的文件进行分块,C# 部分用于重新组装分块并执行 powershell。

远程powershell部分:

$streamChunks = New-Object System.Collections.Generic.List[byte[]]
$buffer = New-Object byte[] 1024
[IO.FileStream] $fileStream = $null
try
{
$targetPath = # FILE TO GET
$fileStream = [IO.File]::OpenRead($targetPath)
[int] $bytesRead = 0
while (($bytesRead = $fileStream.Read($buffer, 0, 1024)) -gt 0)
{
$chunk = New-Object byte[] $bytesRead
[Array]::Copy($buffer, $chunk, $bytesRead)
$streamChunks.Add($chunk)
}
Write-Output $streamChunks
}
finally
{
if ($fileStream -ne $null)
{
$fileStream.Dispose()
$fileStream = $null
}
};

请注意,此脚本将由本地计算机上的运行空间调用:

Pipeline pipeline = runspace.CreatePipeline(command); // command is powershell above
Collection<PSObject> results = pipeline.Invoke();

用于重新组装 block 的 C# 部分:

using (FileStream fileStream = new FileStream(localPath, FileMode.OpenOrCreate, FileAccess.Write))
{
foreach (PSObject result in results)
{
if (result != null)
{
byte[] chunk = (byte[])result.BaseObject;
if (chunk != null)
{
fileStream.Write(chunk, 0, chunk.Length);
}
}
}
}

关于c# - 在远程 powershell session 期间复制文件 c# runspace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30870695/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com