使用invoke命令调用web请求不工作

时间:2018-02-12 05:14:00

标签: powershell

我正在尝试编写PowerShell脚本以使用winrm从远程计算机获取输出。我基本上在invoke-command中运行一个invoke web request命令。但我得到的输出不同于我在远程计算机上运行相同的代码时,任何帮助将不胜感激。以下是代码段的示例:

$url = "https://yahoo/finance"

$s = (New-PSSession -ComputerName computername -Credential domain\abcd) 
$result = Invoke-Command -Session $s -ScriptBlock {$response  = try { Invoke-WebRequest $url} catch { $_.Exception.Response.StatusCode.value__ }
write-host $response
}

write-host $response

1 个答案:

答案 0 :(得分:0)

您需要向我们展示错误/问题,或者至少解释一下。您的代码中也存在问题。

$ url不对。

这......

$ url =" https://yahoo/finance"

应该是......

$ url =" https://www.yahoo.com/finance"

Write-Host清除缓冲区,因此,使用后不会返回任何内容。避免使用它。您不需要它来写入屏幕,只需使用变量名称。

这......

$ url =" https://yahoo/finance"

......不会在这里工作

$ result = Invoke-Command -Session $ s -ScriptBlock {$ response = try {Invoke-WebRequest $ url} catch {$ _.Exception.Response.StatusCode.value__}

...因为$ url是一个局部变量,并且不能像你使用它那样在远程机器上使用。

您需要将此本地变量设置为远程可用。要求做以下......

  

关于远程变量

     

LONGDESCRIPTION

     

您可以在远程计算机上运行的命令中使用变量。   只需为变量赋值,然后使用变量   价值的地方。

     

默认情况下,假定定义远程命令中的变量   在命令运行的会话中。您也可以使用变量   在本地会话中定义的,但您必须将它们标识为   命令中的局部变量。

     

使用本地变量

     

您也可以在远程命令中使用局部变量,但必须这样做   表示该变量是在本地会话中定义的。

     

从Windows PowerShell 3.0开始,您可以使用“使用范围”   用于标识远程命令中的局部变量的修饰符。

     

使用的语法如下:

$Using:<VariableName>

$ps = "Windows PowerShell"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}
  

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_remote_variables?view=powershell-5.1

     

使用PowerShell访问远程会话中的本地变量

     

偶尔我会遇到一个使用PowerShell 2.0版的系统   我需要运行一个需要访问的远程命令   局部变量。我永远不会记得如何完成这项任务,所以我   以为我会写一篇关于它的博客作为对我自己的提醒   其他人可能会发现自己处于同一场景中。

     

http://mikefrobbins.com/2017/11/09/access-local-variables-in-a-remote-session-with-powershell

你也很复杂。使用Invoke-Command不需要New-PSSession。您只需使用-computername参数即可。 如果您需要与远程主机建立长期/扩展连接,或者需要将该远程主机的cmdlet代理到您的计算机,则只需要一个会话。