gpt4 book ai didi

powershell - bcdedit、bcdstore 和 powershell

转载 作者:行者123 更新时间:2023-12-03 16:47:18 26 4
gpt4 key购买 nike

所以我可以在 powershell 脚本中编写 bcd 命令,就像我在 cmd 提示符下一样,例如:

bcdedit /default '{current}'

但是我需要一个执行此操作的脚本:
bcdedit /default '{current}'
bcdedit /set '{otherboot}' description "my description"

如果它没有这样做,那将是相反的:
bcdedit /default '{otherboot}'
bcdedit /set '{current}' description "my description"

我需要做的是在 powershell 中找到另一个引导的标识符,我不确定如何。所有谷歌搜索都说要这样做:
$bcdStore=gwmi -name root\wmi -list bcdstore -enableall
$bcdStore|gm
$result=$bcdStore.OpenStore("") # can also use explicit file name.
$store=$result.Store

但是我不知道一旦我拥有它如何使用商店,这似乎有点太复杂了。我的意思是应该有一个更简单的方法......不是吗?

最佳答案

我不知道使用 WMI 的方法,但您可以使用 bcdedit结合 Select-String :

$otherboot = bcdedit /enum |
Select-String "path" -Context 2,0 |
ForEach-Object { $_.Context.PreContext[0] -replace '^identifier +' } |
Where-Object { $_ -ne "{current}" }

说明:
bcdedit /enum的输出看起来大致是这样的:

Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume1
description Windows Boot Manager
locale en-US
...

Windows Boot Loader
-------------------
identifier {current}
device partition=C:
path \Windows\system32\winload.exe
description Windows 7
locale en-US
...

Windows Boot Loader
-------------------
identifier {e0610d98-e116-11e1-8aa3-e57ee342122d}
device partition=C:
path \Windows\system32\winload.exe
description DebugEntry
locale en-US
...

此输出的相关部分是 Windows Boot Loader部分,与 Windows Boot Manager 不同部分 - 有一个 path记录。因此,我们可以使用此记录仅选择 Windows Boot Loader部分:
Select-String "path"

identifier记录是 path 之前的 2 行记录,我们需要两行 PreContext (并且没有 PostContext ):
Select-String "path" -Context 2,0

现在我们已经从 bcdedit /enum 的输出中选择了以下两个块:
identifier              {current}device                  partition=C:path                    \Windows\system32\winload.exe
identifier              {e0610d98-e116-11e1-8aa3-e57ee342122d}device                  partition=C:path                    \Windows\system32\winload.exe

Since we're only interested in the first line of the PreContext we select these 2 lines using a ForEach-Object loop:

ForEach-Object { $_.Context.PreContext[0] }

这将两个块减少到这个:
identifier              {current}
identifier              {e0610d98-e116-11e1-8aa3-e57ee342122d}

from which we remove the category (identifier) via string replacement:

ForEach-Object { $_.Context.PreContext[0] -replace '^identifier +' }

正则表达式 '^identifier +'匹配以单词“identifier”开头的(子)字符串,后跟一个或多个空格,该字符串被替换为空字符串。在这个替换之后,两个块减少到这个:
{current}
{e0610d98-e116-11e1-8aa3-e57ee342122d}

So now we only need to filter out the chunk containing {current} and what's left is the identifier of the other boot record:

Where-Object { $_ -ne "{current}" }

在此之后,变量 $otherboot包含非当前引导记录的标识符。

关于powershell - bcdedit、bcdstore 和 powershell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com