在远程服务器上执行脚本块

时间:2020-08-20 13:38:48

标签: powershell

我写了一个脚本,可以在本地服务器上正常工作。但是,我想在远程服务器上运行脚本块。这是可以在本地正常运行的脚本块。我可以使用Invoke-Command嵌入以下脚本块并在远程服务器上运行它吗?

autotools

2 个答案:

答案 0 :(得分:1)

是的,这很简单:

$Session = New-PSSession -ComputerName "qtestwest01"

$SB = 
{
    $pt = New-Object System.Diagnostics.ProcessStartInfo;
    $pt.FileName = "E:\testscripts\capture.bat";
    $pt.UseShellExecute = $false;
    $pt.RedirectStandardInput = $true;
    $e = [System.Diagnostics.Process]::Start($pt);
    $e.StandardInput.WriteLine("`n")
}

Invoke-Command -Session $Session -ScriptBlock $SB

旁白:您可能想看看Start-Process -PassThru。尽管我不确定您是否可以使用该模式设置UseShellExecute。有关here的一些细节,但我没有对其进行详尽的阅读。

更新

响应您的实现和参数问题,重复调用Invoke-Command是不必要的。您正在调用同一会话,因此从功能上讲,它是相同的,但是所需的一切都可用,因此您可以运行一个命令。只要脚本块与某些cmdlet(可能主要包括$Using:)一起使用,Invoke-Command修饰符就可以在预制ScriptBlock中使用。

一个新示例:

$FilePath = "C:\windows\System32\notepad.exe"
$Session = New-PSSession -ComputerName "Server1"

$SB = 
{
    $pt = New-Object System.Diagnostics.ProcessStartInfo;
    $pt.FileName = $Using:FilePath;
    $pt.UseShellExecute = $false;
    $pt.RedirectStandardInput = $true;
    $e = [System.Diagnostics.Process]::Start($pt);
    $e.StandardInput.WriteLine("`n")
}

Invoke-Command -Session $Session -ScriptBlock $SB

将参数传递到脚本块中的第二种方法是使用Invoke-Command -ArgumentList参数:

示例:

$FilePath = "C:\windows\System32\notepad.exe"
$Session = New-PSSession -ComputerName "Server1"

$SB = 
{
    $pt = New-Object System.Diagnostics.ProcessStartInfo;
    $pt.FileName = $args[0] ;
    $pt.UseShellExecute = $false;
    $pt.RedirectStandardInput = $true;
    $e = [System.Diagnostics.Process]::Start($pt);
    $e.StandardInput.WriteLine("`n")
}

Invoke-Command -Session $Session -ScriptBlock $SB -ArgumentList $FilePath

而且,即使引用以下命令内联脚本块,也可以使用$Using$args[0]这两种方法。

示例:

$FilePath = "C:\windows\System32\notepad.exe"
$Session = New-PSSession -ComputerName "Server1"

Invoke-Command -Session $Session -ArgumentList $FilePath -ScriptBlock {
    $pt = New-Object System.Diagnostics.ProcessStartInfo;
    $pt.FileName = $args[0] ;
    $pt.UseShellExecute = $false;
    $pt.RedirectStandardInput = $true;
    $e = [System.Diagnostics.Process]::Start($pt);
    $e.StandardInput.WriteLine("`n")
}

注意:

在这些示例中,

-ComputerName参数名称和$FilePath值被更改,只是为了可以在我的环境中进行测试。

使用$FilePath代替$Folder。据我所知,$pt.FileName属性需要完整的路径。在上一个样本中,这是错误键入或错误的。 $ FilePath,因为-FilePath上的Start-Process参数。

答案 1 :(得分:0)

$folder = 'testscripts'
$Session = New-PSSession -ComputerName "qtestwest01"

Invoke-Command -Session $Session -ScriptBlock {$pt = New-Object System.Diagnostics.ProcessStartInfo;}
Invoke-Command -Session $Session -ScriptBlock {$pt.FileName = $using:folder;}
Invoke-Command -Session $Session -ScriptBlock {$pt.UseShellExecute = $false;}
Invoke-Command -Session $Session -ScriptBlock {$pt.RedurectStandardInput = $true;}
Invoke-Command -Session $Session -ScriptBlock {$e = [System.Diagnostics.Process]::Start($pt);}
Invoke-Command -Session $Session -ScriptBlock {$e.StandardInput.WriteLie("`n")}