4

SS64 говорит, что значит

Не ждите завершения приложения. Используйте только для неинтерактивных приложений.

Но я этого не понимаю. Я пытаюсь выполнить некоторые неинтерактивные системные вызовы, но, если я не -d , моя работа в PowerShell никогда не вернется, и, если я передам , -d , я ничего не получу, когда она вернется. Может кто-нибудь сказать мне, что именно -d делает?

Или для бонусных баллов, вы можете сказать мне, как сделать это возвращение чем-то полезным:

C:\PSExec.exe \\$hostname /accepteula -u user -p pass -d cmd /C "type $file" 2> $null

2 ответа2

3

-d , как указано в описании, приведенном в вашем вопросе, заставляет PsExec не ждать завершения нового процесса. Вы не можете получить код выхода или вывод, потому что удаленная служба PsExec просто запускает процесс, сообщает новый идентификатор процесса исходной программе PsExec и перестает заботиться о том, что делает новый процесс. Без -d весь вывод процесса будет отправлен обратно в программу PsExec, которая все это запустила, и PsExec придется ждать завершения нового процесса, чтобы он мог знать, когда выйти сам.

PsExec не играть хорошо с перенаправлением или PowerShell. Мне удалось получить частичный вывод, запустив начальный экземпляр PowerShell с параметром -inputformat none , но PsExec странным образом отсекает часть вывода команды, и я не мог обойти его.

Вы можете попробовать PowerShell Remoting вместо:

Invoke-Command {type $file} -ComputerName $hostname -Credential (New-Object PSCredential -ArgumentList 'username', (ConvertTo-SecureString 'password' -AsPlainText -Force))
2

Что касается неинтерактивного -d , он просто запускает команду, не возвращая вывод, а затем завершает удаленный запрос. На самом деле это происходит, только возвращая код ошибки удаленного процесса. В вашем случае он отображает вывод $file в несуществующем скрытом окне cmd на удаленной машине и завершается. Вот почему вы ничего не видите. Попробуйте создать файл на удаленном компьютере, используя ключ -d и вы увидите, что он работает.

Обновить:

Если $file является переменной на удаленном компьютере, проблема в том, что вы используете переменную, которая раскрывается в вашей локальной среде powershell (как вы уже упоминали), поэтому используйте вместо нее переменную cmd (учитывая, что вы отправляете команду в cmd), которая не не расширяется в powershell. 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

Или ... используйте Invoke-Command, как указано здесь:

PS C:\> invoke-command -filepath c:\scripts\test.ps1 -computerName $hostname

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .