2015-06-16 3 views
1

Кто-нибудь знает, как отключить быстрый режим редактирования из сценария powershell? «Ответ» на этот вопрос не является ответом:Команды скриптов для отключения режима быстрого редактирования

Enable programmatically the "Quick Edit Mode" in PowerShell

(Хотя можно было бы установить настройки реестра программно, делать это не скажется на текущей сессии).

Я просмотрел $host, $host.UI и $host.UI.RawUI объектов и не могу найти что-либо релевантное.

Чтобы сделать вещи более понятными, я не хочу менять реестр. В частности, я не хочу менять поведение по умолчанию. Фактически, есть только один скрипт и действительно только одна ветвь скрипта, где мне нужно отключить быстрое редактирование. Поэтому мне нужно иметь возможность отключить его программно. Или, по крайней мере, сможете запустить powershell с параметрами командной строки, чтобы отключить быстрое редактирование.

Спасибо.

+0

Я вижу, запись в реестре является единственным способом, вероятно. – Rahul

+0

То, что вы хотите, невозможно. –

+0

@AnsgarWiechers Можете ли вы дать мне немного больше информации? Откуда ты это знаешь? Например, это просто потому, что соответствующие свойства объекта не были обнаружены или это фундаментальная проблема с тем, как IO выполняется в окне оболочки? Благодарю. –

ответ

0

Давид

Я не уверен, если вы нашли решение вашей проблемы или нет, но я наткнулся на ваш пост, исследуя способ иметь PowerShell сумы отключить опцию Quick Edit под Изменить параметры. Насколько я знаю из моих исследований, Рахул прав: единственный способ сделать это изменение «программным» - через реестр. Я знаю, что вы сказали, что вы не хотите менять реестр, но есть способ изменить значение реестра, запустить новый процесс powershell, выполнить блок сценариев в этом процессе powershell, а затем изменить значение реестра обратно. Это, как вы могли бы сделать это:

Предполагая, что необходимое значение реестра не существует:

Set-Location HKCU:\Console 
New-Item ‘.%SystemRoot%_System32_WindowsPowerShell_v1.0_Powershell.exe’ 
Set-Location ‘.%SystemRoot%_System32_WindowsPowerShell_v1.0_Powershell.exe’ 
New-ItemProperty . QuickEdit –Type DWORD –Value 0x00000000 
Start-Process Powershell.exe “&{ <#The scrip block you want to run with Quick Edit disabled#> }” 
Set-ItemProperty . QuickEdit –Value 0x00000001 
Pop-Location 

Предполагая, что необходимое значение реестра существует:

Set-Location HKCU:\Console 
Set-Location ‘.%SystemRoot%_System32_WindowsPowerShell_v1.0_Powershell.exe’ 
Set-ItemProperty . QuickEdit –Value 0x00000000 
Start-Process Powershell.exe “&{ <#The scrip block you want to run with Quick Edit disabled#> }” 
Set-ItemProperty . QuickEdit –Value 0x00000001 
Pop-Location 

Если вставить этот код в часть вашего скрипта, которую вы хотите запустить с отключенным Quick Edit, вы должны получить результат, который вы ищете. Надеюсь, это поможет.

-Cliff

+0

Спасибо за ответ. Да, это сработает, но есть и другие, более простые способы решения настоящей проблемы. Отключение quick-edit решило бы мою проблему: это можно сделать просто, но поскольку это невозможно сделать просто, я могу прибегнуть к другим методам решения моей реальной проблемы. –

1

Я надеюсь, что не слишком поздно.

Это решение основано на C#, но оно не использует никаких глобальных настроек или реестра.

Решение на основе этого переполнения стека вопрос: How to programmatic disable C# Console Application's Quick Edit mode?

[email protected]" 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 


public static class DisableConsoleQuickEdit 
{ 

const uint ENABLE_QUICK_EDIT = 0x0040; 

// STD_INPUT_HANDLE (DWORD): -10 is the standard input device. 
const int STD_INPUT_HANDLE = -10; 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern IntPtr GetStdHandle(int nStdHandle); 

[DllImport("kernel32.dll")] 
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); 

[DllImport("kernel32.dll")] 
static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); 

public static bool SetQuickEdit(bool SetEnabled) 
{ 

    IntPtr consoleHandle = GetStdHandle(STD_INPUT_HANDLE); 

    // get current console mode 
    uint consoleMode; 
    if (!GetConsoleMode(consoleHandle, out consoleMode)) 
    { 
     // ERROR: Unable to get console mode. 
     return false; 
    } 

    // Clear the quick edit bit in the mode flags 
    if (SetEnabled) 
    { 
     consoleMode &= ~ENABLE_QUICK_EDIT; 
    } 
    else 
    { 
     consoleMode |= ENABLE_QUICK_EDIT; 
    } 

    // set the new mode 
    if (!SetConsoleMode(consoleHandle, consoleMode)) 
    { 
     // ERROR: Unable to set console mode 
     return false; 
    } 

    return true; 
} 
} 

"@ 

$QuickEditMode=add-type -TypeDefinition $QuickEditCodeSnippet -Language CSharp 


function Set-QuickEdit() 
{ 
[CmdletBinding()] 
param(
[Parameter(Mandatory=$false, HelpMessage="This switch will disable Console QuickEdit option")] 
    [switch]$DisableQuickEdit=$false 
) 


    if([DisableConsoleQuickEdit]::SetQuickEdit($DisableQuickEdit)) 
    { 
     Write-Output "QuickEdit settings has been updated." 
    } 
    else 
    { 
     Write-Output "Something went wrong." 
    } 
} 

Теперь вы можете отключить или включить быстрый вариант редактирования с помощью:

Set-QuickEdit -DisableQuickEdit 
Set-QuickEdit 
+0

Спасибо за это. Да, уже слишком поздно - мне давно не удалось решить эту проблему. Но если у меня будет время проверить это, я сделаю это и отметю как ответ. Выглядит очень многообещающе. OTOH, возможно, вы могли бы прокомментировать актуальность комментария AveYo ниже? –

+0

У меня была такая же проблема, и ваш ответ сработал хорошо для меня. Благодаря! – Kevinoid

Смежные вопросы