Не найден позиционный параметр, который принимает аргумент ERROR в Powershell - PullRequest
0 голосов
/ 05 декабря 2018

Я новичок в Powershell и пытаюсь запустить сценарий PS, используя другой сценарий PS, чтобы запустить его как администратор в Jenkins. Этот сценарий выдает желаемый результат, но также выдает ошибку в выводе.Нужна помощь КАК МОЖНО СКОРЕЕ

Powershell: Start-Process: невозможно найти позиционный параметр, который принимает аргумент В строке: 4 символа: 1 + Powershell -Command "Start-Process powershell" "cd" F: \RiskLink \ RiskL ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (Start-Process: ... cepts аргумент: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError

Set-Location -Path F:\abd\abc
$path = ".\xyz.ps1"
Powershell -Command "Start-Process powershell ""cd "F:\abd\abc"; & $path"" -Verb RunAs"

1 Ответ

0 голосов
/ 06 декабря 2018

Давным-давно я создал простой парсер командной строки (сценарии cliparser.ps1 и cli parser.ps1):

PS D:\PShell> Get-Content ".\cliparser.ps1"
    if ( $args -ne $null ) { $aLen=$args.Count } else { $aLen=0 }
    "$(Split-Path -Path $PSCommandPath -Leaf): $aLen parameters"
    for ( $i = 0; $i -lt $aLen ; $i++ ) { "{0}. [{1}]" -f $i, $args[$i] }

Используется вместо вашего xyz.ps1, это показывает, что что-то должно пойти не тактолько с Start-Process аргументами , но также с кавычками (показывает предоставленные значения -Verb и RunAs).Исправлено с небольшими усилиями… Улучшено для пробелов в путях и именах файлов, см. Следующий скрипт:

$cd = (Get-Location -PSProvider Filesystem).Path
$path = ".\cliparser.ps1"
'... original (known error)'
Write-Host Powershell -Command "Start-Process powershell ""pushd "$cd"; & $path"" -Verb RunAs"
Powershell -Command "Start-Process powershell ""pushd "$cd"; & $path"" -Verb RunAs"
pause
'... fixed'
Write-Host Powershell -NoProfile -Command "Start-Process powershell -ArgumentList '-NoProfile', '-noexit', '-command', 'pushd `'`'$cd`'`'; & `'`'$path`'`';' -Verb RunAs"
$path = ".\cli parser.ps1"
Powershell -NoProfile -Command "Start-Process powershell -ArgumentList '-NoProfile', '-noexit', '-command', 'pushd `'`'$cd`'`'; & `'`'$path`'`';' -Verb RunAs"
'done'

Обратите внимание, что параметры PShell -NoProfile и -NoExit здесь приведены только для целей отладки.

Результат :

PS D:\PShell> D:\PShell\SO\53638416.ps1
... original (known error)
Powershell -Command Start-Process powershell "pushd  D:\PShell; & .\cliparser.ps1" -Verb RunAs
Start-Process : A positional parameter cannot be found that accepts argument 'D:\PShell'.
At line:1 char:1
+ Start-Process powershell pushd  D:\PShell; & .\cliparser.ps1 -Verb Ru ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.Start
   ProcessCommand

cliparser.ps1: 2 parameters
0. [-Verb]
1. [RunAs]
Press Enter to continue...:
... fixed
Powershell -NoProfile -Command Start-Process powershell -ArgumentList '-NoProfile', '-noexit', '-command', 'pushd ''D:\PShell''; & ''.\cliparser.ps1'';' -Verb RunAs
done
PS D:\PShell>

Вызываемое (повышенное) окно Powershell выглядит следующим образом (Pop-Location используется для обеспечения того, чтобы popd работал хорошо):

administrator PShell

Для запуска из подсказки cmd и передачи аргументов вызываемому сценарию:

powershell -NoProfile -Command "Start-Process powershell -ArgumentList '-NoProfile', '-noexit', '-command', 'pushd ''D:\PShell''; & ''.\cliparser.ps1'' a b c;' -Verb RunAs"

enter image description here

Работает также для pwsh вместо powershell:

pwsh -NoProfile -Command "Start-Process pwsh -ArgumentList '-NoProfile', '-noexit', '-command', 'pushd ''D:\PShell''; & ''.\cliparser.ps1'' a b c;' -Verb RunAs"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...