SS64说这意味着
不等待应用程序终止。仅用于非交互式应用程序。
但我不明白这一点。我试图运行一些非交互式系统调用,但如果我不传递-d
,我的 powershell 作业就永远不会返回,如果我传递-d
,当它返回时,我不会得到任何东西。有人能告诉我 -d 到底是干什么的吗?
或者为了获得加分,你可以告诉我如何让这个返回变得有用:
C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null
答案1
-d
正如问题中引用的描述中提到的,该开关使 PsExec 不等待新进程退出。您无法获得任何退出代码或输出,因为远程 PsExec 服务只是启动进程,将新进程 ID 告知原始 PsExec 程序,然后不再关心新进程执行的操作。如果没有-d
,所有进程的输出都将发送回启动整个进程的 PsExec 程序,并且 PsExec 将不得不等待新进程退出,这样它才能知道何时退出。
执行程序没有 玩 很好 和 重定向 或者 电源外壳我确实设法得到了部分的通过使用参数启动启动 PowerShell 实例来输出-inputformat none
,但 PsExec 奇怪地切断了部分命令的输出,我无法解决这个问题。
你可以尝试PowerShell 远程处理反而:
Invoke-Command {type $file} -ComputerName $hostname -Credential (New-Object PSCredential -ArgumentList 'username', (ConvertTo-SecureString 'password' -AsPlainText -Force))
答案2
关于 非交互式 -d
,它只是运行命令,而不返回输出,然后终止远程提示。实际上,它确实会这样做,只返回远程进程的错误代码。在您的例子中,它在远程机器上$file
不存在的隐藏cmd
窗口中显示输出并终止。这就是您看不到任何东西的原因。尝试使用-d
switch 在远程机器上创建一个文件,然后您会看到它有效。
更新:
如果$file
是远程机器中的变量,那么问题就在于您正在使用在本地 powershell 环境中扩展的变量(如您所提到的),因此请改用在 powershell 中不会扩展的cmd
变量(考虑到您正在发送命令到)。cmd
PSExec.exe \\$hostname -u user -p pass -d cmd /c "type %file%" 2> $null
但是,这不是真正的解决方案!因为如果您想远程向 powershell 发送命令怎么办?您需要一些阻止扩展的东西,例如%%varibale%%
。cmd
我发现使用 " 会扩展,但 ' 会阻止在 powershell 中扩展:
PS> "This is $file"
反对PS> 'This is $file'
但这对您的情况没有帮助,不过,另一种方法是在本地机器上创建一个脚本,然后使用 PSEXEC 发送到目的地:
PSExec.exe \\$hostname -u user -p pass -c powershell script.ps1 2> $null
PS C:\> invoke-command -filepath c:\scripts\test.ps1 -computerName $hostname