Start-process: как позиционный параметр, так и не удается найти указанный файл

#powershell #deployment #remote-access

#powershell #развертывание #удаленный доступ

Вопрос:

Хорошо, итак, я работаю над удаленным развертыванием программного обеспечения powershell для пользователей AD. У меня есть удаленный доступ к компьютеру и все, никаких проблем нет.

Прямо сейчас я нахожусь в точке, где у меня есть exe-файл из Ninite, чтобы просто установить 7zip на клиентский компьютер, просто чтобы посмотреть, когда он работает, чтобы я мог начать развертывать на нем несколько более крупных программ.

Руководство, которое я нашел, чтобы помочь мне развернуть программное обеспечение на данный момент, выглядит следующим образом:

 Invoke-Command -ComputerName *REDACTED* -Scriptblock {
    Start-Process C:UsersAdministratorDocumentsninite_7_zipNinite 7Zip Installer.exe '/silent' -wait
}
  

Когда я запускаю этот код, я получаю сообщение об ошибке:

Не удается найти позиционный параметр, который принимает аргумент ‘Installer.exe «.

Поэтому я подумал про себя, что это может быть из-за пробелов в имени. Поэтому я изменил его на:

 Invoke-Command -ComputerName *REDACTED* -Scriptblock {
        Start-Process C:UsersAdministratorDocumentsninite_7_zipNinite_7Zip_Installer.exe '/silent' -wait
    }
  

И, конечно, также изменил его имя в папке, чтобы оно соответствовало «недавно созданному» коду.

Но ошибка теперь изменилась на:

Эта команда не может быть запущена из-за ошибки: система не может найти указанный файл

Несмотря на то, что я использую Powershell ISE, и я использовал его направляющие при записи, чтобы войти в папку и найти ее, когда я писал каталог.

Моя единственная цель в этом заключается в том, что я хочу удаленно запустить и завершить этот установщик на клиентском компьютере при развертывании с домена, на котором находится файл.

У кого-нибудь есть квалифицированное предположение? Или, может быть, даже так, решение.

Заранее спасибо за ваши добрые ответы.

Комментарии:

1. Тогда почему бы не использовать путь в формате UNC к общему ресурсу на DC, на котором находится файл ? Что-то вроде Start-Process '\ServerDeploymentShareninite_7_zipNinite_7Zip_Installer.exe' '/silent' -wait

Ответ №1:

Когда я запускаю этот код, я получаю сообщение об ошибке:

Не удается найти позиционный параметр, который принимает аргумент ‘Installer.exe «.

Вы захотите использовать кавычки для определения имен путей с пробелами в них:

 Start-Process 'C:UsersAdministratorDocumentsninite_7_zipNinite 7Zip Installer.exe' '/silent' -wait
  

Но ошибка теперь изменилась на:

Эта команда не может быть запущена из-за ошибки: система не может найти указанный файл

Несмотря на то, что я использую Powershell ISE, и я использовал его направляющие при записи, чтобы войти в папку и найти ее, когда я писал каталог.

ISE недостаточно умен, чтобы понять, что scriptblock должен выполняться на удаленном компьютере, поэтому он завершает путь на основе вашей локальной файловой системы.

Вам все равно нужно скопировать исполняемый файл на удаленный компьютер, чтобы выполнить его:

 # first copy the installer to remote file system
$remoteSession  = New-PSSession -ComputerName $computerName
$localInstaller = 'C:UsersAdministratorDocumentsninite_7_zipNinite 7Zip Installer.exe'
$remotePath     = Invoke-Command -Session $remoteSession -ScriptBlock { $env:TEMP }
Copy-Item $localInstaller -Destination (Join-Path $remotePath "7zInstaller.exe") -ToSession $remoteSession

# now we can invoke the executable on the remote machine (re-using the same remoting session)
Invoke-Command -Session $remoteSession -ScriptBlock {
  Start-Process (Join-Path $env:TEMP "7zInstaller.exe") '/silent' -Wait
}

# clean up
$remoteSession |Remove-PSSession |Out-Null
  

Комментарии:

1. после создания потока и работы над ним я также понял, что проблема заключалась в том, что отсутствовал «путь к файлу, и что я искал не тот файл, и его никогда не было на клиентском компьютере. код, который вы написали здесь, по-прежнему выдает ошибку:> Invoke-Command: набор параметров не может быть разрешен с использованием указанных именованных параметров

2. кроме того, { $ env:TEMP} что это делает? никогда не видел этого раньше

3. @Mikeskovby $env:Temp разрешает значение %TEMP% переменной среды (попробуйте сами!). Причина выполнения этого на удаленном компьютере заключается в том, что он может отличаться от временного пути в вашей локальной системе / сеансе

4. ИЗ-за ошибки я забыл включить -Scriptblock перед аргументом, теперь я обновил ответ

5. после корректировки изменения кажется, что оно не устанавливает его на клиентский компьютер, поскольку я запустил код, он прошел без ошибок или чего-либо еще (большое спасибо!), Но у меня все еще нет 7zip, установленного на клиентском компьютере