我创建了一个脚本,它将从一个有电话号码的文件中发送短信。现在我试图通过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
答案 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