从我的脚本中我想在远程Windows框中运行一些命令。所以我用google搜索了一下,似乎最流行和不知何故的标准方法是使用PowerShell的Invoke-Command
cmdlet,它似乎使用与winrm
和winrs
相同的协议。所以,下面是我试图从我的脚本调用的命令(实际上我已经尝试了很多其他的修改,但IMO这些足以说明问题):
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>};"
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};"
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
调用命令脚本,请注意,作为命令应该从脚本运行,它们不应该需要任何交互操作。
所以,我对这些命令有几个问题,需要帮助来弄清楚它们。他们在这里:
configure and run daemon
类型的进程。也就是说,如果我想在远程方框(configure_server.pl
)上运行<fullcommand> = "configure_server.pl <arguments>"
,这应该做一些事情,然后运行server.exe
,它就不起作用,因为只要{{1}完成后,完整的远程作业被杀死,包括应该作为守护进程运行的configure_server.pl
。 (适用于第1,2,3点)答案 0 :(得分: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 /查询并在执行schtasks.exe / delete之前检查“状态”是否正常运行。
2。使用`(反引号)将进位执行指定到powershell中的下一行 3。我用这个函数得到标准输出和错误,有时在大脚本中执行时不输出,但总是可以使用$?捕获错误。
注意:您无法将PSCredentials传递给此命令。我建议创建一个只提示输入userName和密码的GUI,而不转换为安全字符串。我试图远离我的脚本中的远程处理,因为它总是让一切都变得如此缓慢。有时你没有选择,但在这种情况下我相信你这样做。