У меня был скрипт, в конце которого вызывалось меню, где можно было выбрать из списка номер задачи (ввести это число с клавиатуры и нажать Enter). После выбора скрипт вызывал сам себя, но уже с выбранными параметрами. И всё работало, пока я не перенёс скрипт в папку, содержащую в своём имени пробелы.
script.ps1
## Confirmation dialog
$answered = $false
while(-not $answered)
{
$confirmation = Read-Host "Enter the number ('a' or '*' for all) or 'Q' to exit: "
if ($confirmation -match "[aA*]")
{
$cmd = $MyInvocation.MyCommand.Path + " -Task ALL"
$answered = $true
}
elseif ($confirmation -match "[qQ]")
{
Exit
}
elseif ($null -ne ($confirmation -as [int]))
{
$answered = $true
$cmd = $MyInvocation.MyCommand.Path + " -Task $confirmation"
}
if ($answered)
{
Write-Output "`n"
Invoke-Expression $cmd
}
}
В папке «C:\Program Files\PSUtils» этот скрипт уже не вызывал сам себя. Я пробовал через Start-Process -FilePath $path -NoNewWindow, это работало, но после выхода из скрипта, курсор куда-то улетал вверх, что было неудобно.
Решение
Выходом стало использование одинарных кавычек:
Invoke-Expression "& `"$PSCommandPath`" $arguments"
Полный код фрагмента теперь такой:
script.ps1
## Confirmation dialog
$answered = $false
while (-not $answered)
{
$confirmation = Read-Host "Enter the number ('a' or '*' for all) or 'Q' to exit"
if ($confirmation -match "[aA*]")
{
$answered = $true
$arguments = " -Task ALL"
}
elseif ($confirmation -match '^[0-9]+$')
{
$answered = $true
$arguments = " -Task $confirmation"
}
elseif ($confirmation -match "[qQ]")
{
$answered = $false
Write-Output "key $confirmation pressed"
Exit
}
if ($answered)
{
Write-Output "`n"
Invoke-Expression "& `"$PSCommandPath`" $arguments"
}
}
DenTNT недавно публиковал (посмотреть все)
- WordPress: Ошибка в плагине WpDiscuz - 08.10.2024
- Windows 10: Уменьшить размер виртуальной машины WSL - 06.10.2024
- Windows 10: Событие EventID 63 в Журнале Приложений - 28.09.2024