调用PowerShell脚本错误

时间:2018-01-20 00:15:32

标签: powershell

我创建了一个脚本,它将从一个有电话号码的文件中发送短信。现在我试图通过Invoke-Command调用相同的内容我正在获得成功消息,但我没有收到短信。当我使用相同的文件并手动运行时,我收到短信。

$ErrorActionPreference = "Stop"
Set-Location g:
$Date= (Get-Date).ToString('yyyy-MM-dd')
$OutputFile2 = "\\XXX\yyy\SendTextMsg\" + $Date + "_sms.txt"
$SendTextMsgExe = ".\\XXX\yyy\SendTextMsg\SendTextMsg.exe $OutputFile2"
Invoke-Command -ComputerName XXX -ScriptBlock {$Args[0]} -Args $SendTextMsgExe

1 个答案:

答案 0 :(得分:0)

您发布的代码只会回显远程主机上$SendTextMsgExe的值,因为您将其定义为单个字符串。要执行单个命令字符串,您需要在scriptblock中使用Invoke-Expression。但是,这样做是not recommended。最好分别传递命令和参数,通过call operator调用它们并使用splatting将参数传递给命令。

# define $params as a list of values (comma separated):
# $params = 'C:\path\to\some.txt', '-x', 'x_value', ...
$params = $OutputFile2
$SendTextMsgExe = "\\XXX\yyy\SendTextMsg\SendTextMsg.exe"
Invoke-Command -ComputerName XXX -ScriptBlock {
    Param($cmd, $param)
    & $cmd @param
} -Args $SendTextMsgExe, $params

但即使这样你的代码可能仍然无法工作,因为你从UNC路径调用可执行文件(也使用来自UNC路径的文本文件),所以你应该遇到2nd hop problem

如果您不能使用该文章中描述的CredSSP方法,则需要将UNC路径映射到具有显式凭据的驱动器,然后从网络驱动器运行命令:

$cred = Get-Credential
$OutputFile2 = "${Date}_sms.txt"
$SendTextMsgExe = '\\XXX\yyy\SendTextMsg\SendTextMsg.exe'
Invoke-Command -ComputerName XXX -ScriptBlock {
    Param($cmd, $param)

    $path = Split-Path $cmd -Parent
    $exe  = Split-Path $cmd -Leaf

    $d = New-PSDrive -Name 'X' -Root $path -Credential $using:cred -Persist -PSProvider FileSystem
    Set-Location $d.Root

    & ".\$exe" @param

    Remove-PSDrive $d
} -Args $SendTextMsgExe, $OutputFile2