psexec -d 有什么作用?

psexec -d 有什么作用?

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窗口中显示输出并终止。这就是您看不到任何东西的原因。尝试使用-dswitch 在远程机器上创建一个文件,然后您会看到它有效。

更新:

如果$file是远程机器中的变量,那么问题就在于您正在使用在本地 powershell 环境中扩展的变量(如您所提到的),因此请改用在 powershell 中不会扩展的cmd变量(考虑到您正在发送命令到)。cmdPSExec.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

相关内容