Попытка выполнить scanstate.exe с powershell - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь создать графический интерфейс с PowerShell, чтобы было проще манипулировать scanstate.exe с различными XML-файлами.

Однако, когда я пытаюсь его выполнить, ничего не происходит. Я даю правильное место, но он не может его найти.

    Start-Process : This command cannot be run due to the error: The system cannot find the file specified.
    At C:\DigiTool\DigiTool.ps1:1266 char:129
    + ...             Start-Process -FilePath $c -ArgumentList $arglist -Wait - ...
    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
        + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

Я, вероятно, что-то не так с параметрами, которые я предоставляю. Но я не уверен, что.

$c = Split-Path -Path $PSCommandPath
$c = (Join-Path $c "USMT\amd64\scanstate.exe")
Write-Host "$c"
Write-Host "$arglist"
Start-Process -FilePath $c -ArgumentList $arglist -Wait -PassThru                                                                                                                               

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Вот эффективный идиоматический способ PowerShell для синхронного вызова вашей команды в одном и том же окне консоли с выходом, подключенным к потокам PowerShell :

# Determine the executable's file path.
$c = Join-Path $PSScriptRoot 'USMT\amd64\scanstate.exe'

# Note how &, the call operator is needed for invocation, because the
# executable path is stored in a *variable* (the same would apply if
# a *quoted* string were used).
& $c G:\a_ex03505\10.28.19-14.55.37 /ue:*\* /ui:$user /o /c /i:Custom\MigAppO2019.xml /i:Custom\MigUser_Including_Downloads.xml /i:Migdocs.xml /i:Custom\ExcludeSystemFolders.xml /i:Custom\ExcludeDrives_D_to_Z.xml /i:Custom\ExcludeOneDriveUserFolders.xml

Если вам нужно выполнить команду в заданном рабочем каталоге :

Push-Location $dir

# Note how scanstate.exe, assumed to be located in $dir,
# must be invoked as .\scanstate.exe - with a path component that explicitly
# references the current dir. - in order to be executed from there.
# 
# By design, for security reasons, PowerShell doesn't execute
# executables in the current dir. by file name only - that only works
# for executables in the system's path (dirs. listed in $env:PATH).
.\scanstate.exe G:\a_ex03505\10.28.19-14.55.37 /ue:*\* /ui:$user /o /c /i:Custom\MigAppO2019.xml /i:Custom\MigUser_Including_Downloads.xml /i:Migdocs.xml /i:Custom\ExcludeSystemFolders.xml /i:Custom\ExcludeDrives_D_to_Z.xml /i:Custom\ExcludeOneDriveUserFolders.xml

Pop-Location

То есть, вышеприведенное вызывает scanstate.exe в текущем окне консоли и ожидает его завершения,прохождение его выхода через - хотя с опцией для захвата / ретрансляции / перенаправления выхода для дальнейшей обработки (например, $output = scanstate.exe ... / scanstate.exe | ForEach-Object { ... }, scanstate.exe 2>$null)

  • Вам нужно только Start-Process, если вы хотите запустить команду в новом отдельном окне консоли .

    • Обратите внимание, что это не будет работать на Unix -подобной платформе с PowerShell Core , где неизменно подразумевается -NoNewWindow.
  • Консольные приложения никогда не требуют cmd.exe для выполнения - PowerShell сам по себе является оболочкой, как и cmd.exe, поэтому позвольте it обработать вызов, как показано выше.

Для получения дополнительной информации см. этот ответ .


Вы заявляете, что в вашем случае использования окно консоли скрыто , поэтому, если вам нужна команда для запуска visible , вам действительно нужно Start-Process для запускакоманда в новом окне :

Start-Process -WorkingDirectory $dir scanstate.exe 'G:\a_ex03505\10.28.19-14.55.37 /ue:*\* /ui:$user /o /c /i:Custom\MigAppO2019.xml /i:Custom\MigUser_Including_Downloads.xml /i:Migdocs.xml /i:Custom\ExcludeSystemFolders.xml /i:Custom\ExcludeDrives_D_to_Z.xml /i:Custom\ExcludeOneDriveUserFolders.xml'

Обратите внимание на использование одной буквенной строки ('...') для передачи всех аргументов, которые неявно связываются с параметром -ArgumentList.

Добавьте -Wait, чтобы дождаться закрытия нового окна.

0 голосов
/ 28 октября 2019

Я нашел способ обойти мою проблему с непосредственным вызовом cmd и передачей команды.

Start-Process cmd.exe -WorkingDirectory $ dir -ArgumentList {/ k scanstate.exe G: \ a_ex03505\ 10.28.19-14.55.37 / ue: ** / ui: $ user / o / c /i:Custom\MigAppO2019.xml /i:Custom\MigUser_Inclusive_Downloads.xml /i:Migdocs.xml / i: Custom \ ExcludeSystemFolders.xml /i:Custom\ExcludeDrives_D_to_Z.xml /i:Custom\ExcludeOneDriveUserFolders.xml rout

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...