0

从我的脚本中,我想在远程 Windows 框中运行一些命令。所以我用谷歌搜索了一下,似乎最流行和标准的方法是使用 PowerShell 的Invoke-Commandcmdlet,它似乎使用与winrmand相同的协议winrs。所以,下面是我试图从我的脚本中调用的命令(实际上我也尝试了很多其他的修改,但 IMO 这些足以说明问题):

  1. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {<fullcommand>};"

  2. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; Invoke-Command -ComputerName REMOTE_COMPUTER_NAME -Credential $cred -ScriptBlock {Start-Process -FilePath <fullexepath> -ArgumentList <arguments> -Wait -NoNewWindow};"

  3. PowerShell -Command "$encpass=ConvertTo-SecureString -AsPlainText mypass -Force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass;$session=new-PSSession -ComputerName "REMOTE_COMPUTER_NAME" -Credential $cred; Invoke-Command -Session $session -ScriptBlock {<fullcommand>};"

注意:脚本是用 编写的perl,但 IMO 在这里脚本的语言并不重要,所以你可以假设我从batch脚本调用命令,请注意,由于命令应该从脚本运行,它们不需要任何交互行动。

所以,我对这些命令有几个问题,需要帮助来解决它们。他们来了:

  1. 无法运行 类型的进程configure and run daemon。也就是说,如果我想configure_server.pl在远程框 ( <fullcommand> = "configure_server.pl <arguments>") 上运行,它应该做一些事情,然后运行server.exe,它不起作用,因为一旦configure_server.pl完成,整个远程工作就会被杀死,包括server.exe应该作为守护进程运行的工作。(适用于第 1、2、3 点)
  2. 获取包装(每行的长度小于或等于 80 个字符)标准输出和标准错误。(适用于第 1,3 点)
  3. 不要得到标准输出和标准错误。(适用于第 2 点)
4

1 回答 1

0

唷,这是一个艰难的,你的那种到处都是,所以如果我错过了你试图做的事情,请告诉我。

1. 停止尝试走远程路线。我知道这似乎是个好主意,但事实并非如此。使该过程持续存在的唯一方法是在主机上保持 powershell 窗口处于打开状态。您可能已经注意到,您可以很好地创建进程,但它们是您的 powershell.exe 的子进程,并且由客户端计算机上的 wsmprovhost.exe 进程托管。一旦父母走了,所有的孩子都被杀死了

为了解决这个问题,我建议使用命令行函数:Schtasks.exe
schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime

此命令将创建一个计划任务运行一次,然后自行删除。它甚至需要计算机名称,因此不需要远程访问。您也可以在执行 schtasks.exe /delete 之前执行 schtasks.exe /query 并检查“状态”是否正在运行。

2. 使用 `(反引号)指定执行到 powershell
3 中的下一行。我用这个函数得到标准输出和错误,有时在大脚本中执行时不输出,但总是可以使用 $? 捕获错误。

注意:您不能将 PSCredentials 传递给此命令。我建议制作一个只提示输入用户名和密码的 GUI,而不转换为安全字符串。我尽量避免在我的脚本中进行远程处理,因为它总是让一切变得如此缓慢。有时你别无选择,但在这种情况下,我相信你有。

于 2013-07-23T19:36:03.127 回答