有没有人知道如何在powershell脚本中禁用快速编辑模式?这个问题的“答案”不是答案:
Enable programmatically the "Quick Edit Mode" in PowerShell
(虽然可以以编程方式设置注册表设置,但这样做不会影响当前会话。)
我查看了$host
,$host.UI
和$host.UI.RawUI
个对象,找不到任何相关内容。
为了使事情更清楚,我不想更改注册表。特别是,我不想更改默认行为。实际上,只有一个脚本,实际上只有脚本的一个分支,我需要禁用快速编辑。所以我需要能够以编程方式禁用它。或者至少,能够使用命令行选项启动PowerShell以禁用快速编辑。
感谢。
答案 0 :(得分:1)
我希望不会太晚。
此解决方案基于C#,但不使用任何全局设置或注册表。
基于此Stack Overflow问题的解决方案: How to programmatic disable C# Console Application's Quick Edit mode?
$QuickEditCodeSnippet=@"
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
答案 1 :(得分:0)
大卫,
我不确定您是否找到了问题的解决方案,但我在研究使用PowerShell脚本的方法时禁用了“编辑选项”下的“快速编辑”选项。据我所知,Rahul是正确的:以“编程方式”进行此更改的唯一方法是通过注册表。我知道你说你不想更改注册表,但有一种方法可以更改注册表值,启动一个新的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
如果您将此代码插入到要在禁用“快速编辑”的情况下运行的脚本部分中,则应获得您正在查找的结果。希望这会有所帮助。
-Cliff