我写了一个脚本,可以在本地服务器上正常工作。但是,我想在远程服务器上运行脚本块。这是可以在本地正常运行的脚本块。我可以使用Invoke-Command嵌入以下脚本块并在远程服务器上运行它吗?
autotools
答案 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")}