在 Windows Vista 中,有没有办法从命令提示符窗口的标题中删除“管理员:”字样?
'title' 命令仅更新“Administrator:”之后的部分,所以这样做不行。
答案1
这里还有另外两种可能性:
- 使用 Windows XP 中的 cmd.exe
- 修改cmd.exe的MUI数据:
您需要修改 cmd.exe 的 MUI 数据文件。此文件名为 cmd.exe.mui,位于标准 32 位美国安装中的 C:\Windows\System32\en-US。对于其他语言,en-US 会有所不同,对于 64 位安装,您需要同时修改 System32 和 SysWOW64 中的版本。
首先,获取 cmd.exe.mui 的所有权。右键单击该文件,单击安全选项卡上的“高级”。在所有者选项卡上,单击编辑,然后选择管理员帐户。
现在,授予修改文件的权限。返回文件属性,单击“安全”选项卡上的“编辑”,单击“添加”,输入管理员,然后确保他们将“完全控制”选项设置为“允许”。
使用十六进制编辑器、资源编辑器或您选择的其他编辑器,将文件中的字符串从“Administrator:%0”修改为“%0”(%0 之前有两个空格,不要忘记末尾的空字符)。
保存文件
运行 mcbuilder.exe(这可能需要一些时间)
重新启动计算机。
(从此主题- 注意,您可以使用空格,但它必须是某个东西。)
答案2
runas /trustlevel:0x20000 "cmd /k title My Awesome Command Prompt"
答案3
虽然事实证明它不能解决此错误中的问题,但并不是每个人都知道你可以使用标题命令并将标题设置为您想要的任何内容。
答案4
我刚刚创建了一个简单的 PowerShell 脚本,该脚本依赖于运行时编译的 .NET 类来自动执行 @crb 答案中解释的步骤。
该解决方案适用于cmd.exe.mui
文件的英语和西班牙语版本,并且我只需向对象添加新条目即可轻松添加对更多语言的支持dict
。
享受!。
源代码
$source = @'
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
imports System.Diagnostics
Imports System.IO
imports System.Linq
Imports System.Text
Public NotInheritable Class MainClass
Public Shared Sub Main()
Dim dict As New Dictionary(Of String(), String) From {
{{Environment.ExpandEnvironmentVariables("%SystemRoot%\System32\en-US\cmd.exe.mui"),
Environment.ExpandEnvironmentVariables("%SystemRoot%\SysWOW64\en-US\cmd.exe.mui")},
"Administrator: "},
{{Environment.ExpandEnvironmentVariables("%SystemRoot%\System32\es-ES\cmd.exe.mui"),
Environment.ExpandEnvironmentVariables("%SystemRoot%\SysWOW64\es-ES\cmd.exe.mui")},
"Administrador: "}
}
For Each key As String() In dict.Keys
For Each filepath As String In key
If File.Exists(filepath) Then
Console.WriteLine(String.Format("Searching for string: '{0}' in file: '{1}'", dict(key), filepath))
ReplaceBytes(filepath, Encoding.GetEncoding("UTF-16").GetBytes(dict(key)), {&H81, &H0})
End If
Next filepath
Next key
End Sub
Private Shared Sub ReplaceBytes(filepath As String, find As Byte(), replace As Byte())
Dim buffer As Byte() = File.ReadAllBytes(filepath)
Dim index As Integer = FindByteSequence(buffer, find, 0).DefaultIfEmpty(-1).SingleOrDefault()
If (index <> -1) Then
If Not File.Exists(String.Format("{0}.bak", filepath)) Then
Console.WriteLine(String.Format("Creating backup file: '{0}.bak'", filepath))
File.Copy(filepath, String.Format("{0}.bak", filepath), overwrite:=False)
End If
buffer = buffer.Take(index).Concat(replace).Concat(buffer.Skip(index + find.Length)).ToArray()
Console.WriteLine(String.Format("Rebuilding file: '{0}'", filepath))
Using fs As New FileStream(filepath, FileMode.Create, FileAccess.Write, FileShare.None)
fs.Write(buffer, 0, buffer.Length)
End Using
Else
Console.WriteLine(String.Format("String not found in file: '{0}'", filepath))
End If
End Sub
' Original author: https://stackoverflow.com/a/332667/1248295
Private Shared Function FindByteSequence(buffer As Byte(), pattern As Byte(), startIndex As Integer) As ReadOnlyCollection(Of Integer)
Dim positions As New List(Of Integer)
Dim i As Integer = Array.IndexOf(buffer, pattern(0), startIndex)
Do While (i >= 0) AndAlso (i <= (buffer.Length - pattern.Length))
Dim segment(pattern.Length - 1) As Byte
System.Buffer.BlockCopy(buffer, i, segment, 0, pattern.Length)
If segment.SequenceEqual(pattern) Then
positions.Add(i)
End If
i = Array.IndexOf(buffer, pattern(0), i + 1)
Loop
Return positions.AsReadOnly()
End Function
End Class
'@
$vbType = Add-Type -TypeDefinition $source `
-CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider) `
-PassThru `
-ReferencedAssemblies "Microsoft.VisualBasic.dll", `
"System.dll" `
| where { $_.IsPublic }
[MainClass]::Main()
$Console = [System.Console]
$Console::WriteLine("All done. Press any key to exit...")
$Console::ReadKey($true)
Exit(0)
输出
变更后
笔记:
在 Windows 10.0.18363.959 上使用 PowerShell 5.1.18362.752 进行测试
在@crb 答案中,它说在 64 位操作系统中用户还需要修改
cmd.exe.mui
SysWOW64 目录中的文件,但是我有一个 64 位 Windows 10,并且该文件不存在于 SysWOW64 目录中,无论如何我将该路径添加到代码中以防万一。我没有添加任何运行指令,
mcbuilder.exe
因为我发现这不是必需的......至少对我来说,在打开 CMD 的新实例时会直接应用更改。