通过 Powershell 无法格式化文件系统 NTFS 的磁盘?

通过 Powershell 无法格式化文件系统 NTFS 的磁盘?

通过 Powershell 无法格式化文件系统 NTFS 的磁盘?

以下代码在格式化尝试之前一直有效。脚本以管理员身份运行。文件系统不是 NTFS。块大小是磁盘和 NTFS 的默认值。我在格式化尝试时始终被拒绝访问。截至本文发布之日,环境是已完全修补/更新的 Windows 11。

    Clear-Disk -Number 6 -RemoveData -Confirm:$false
    Initialize-Disk -Number 6 -PartitionStyle GPT -Confirm:$false
    New-Partition -DiskNumber 6 -UseMaximumSize -DriveLetter 'T'
    Format-Volume -DriveLetter 'T' -FileSystem NTFS -NewFileSystemLabel 'Test' -AllocationUnitSize 4096

例子...

PS C:\WINDOWS\system32> Clear-Disk -Number 6 -RemoveData -Confirm:$false
PS C:\WINDOWS\system32> Initialize-Disk -Number 6 -PartitionStyle GPT -Confirm:$false
PS C:\WINDOWS\system32> New-Partition -DiskNumber 6 -UseMaximumSize -DriveLetter 'T'
   DiskPath: \\?\usbstor#disk&ven_hitachi_&prod_dk23aa-60&rev_0000#000000000000&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
PartitionNumber  DriveLetter Offset                                                                                                                 Size Type                                                                                                            
---------------  ----------- ------                                                                                                                 ---- ----                                                                                                            
2                T           16777216                                                                                                            5.58 GB Basic                                                                                                           


PS C:\WINDOWS\system32> Format-Volume -DriveLetter 'T' -FileSystem NTFS -NewFileSystemLabel 'Test' -AllocationUnitSize 4096
Format-Volume : Access Denied
Activity ID: {adc29ae6-3193-0002-4318-dbb09331d901}
At line:1 char:1
+ Format-Volume -DriveLetter 'T' -FileSystem NTFS -NewFileSystemLabel ' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (StorageWMI:ROOT/Microsoft/...age/MSFT_Volume) [Format-Volume], CimException
    + FullyQualifiedErrorId : StorageWMI 40001,Format-Volume

如果我将文件系统更改为 FAT32,则格式命令有效。这对我来说毫无意义。以管理员身份运行脚本时。

使用其他文件系统的示例...

PS C:\WINDOWS\system32> Format-Volume -DriveLetter 'T' -FileSystem FAT32 -NewFileSystemLabel 'Test' -AllocationUnitSize 4096

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining    Size
----------- ------------ -------------- --------- ------------ ----------------- -------------    ----
T           TEST         FAT32          Fixed     Healthy      OK                      5.57 GB 5.57 GB

如果我通过 UI 或命令提示符执行完全相同的步骤diskpart,则不会出现错误。欢迎提出任何建议。

答案1

实际上,这是一个相当扭曲的情况。经过一些广泛的测试。我实际上将 UI(磁盘管理器)转到 Explorer(文件管理器)来复制拒绝访问错误。似乎 PowerShell 能够更快、更轻松地触发该问题。某些进程试图在后台独占控制相关磁盘。因此,我禁用了 Defender、MalwareBytes、所有备份应用程序,甚至确保没有正在运行的还原点捕获进程,并且拒绝访问问题在某个时候消失了。我唯一没有尝试的是完全重启。

之前,我已经完全控制了有问题的磁盘,或者说我认为,在测试中完全替换了所有安全权限,获得了完全所有权等,但仍然有访问被拒绝的问题。我仍然需要追踪独占控制磁盘的特定进程。但至少这似乎是环境问题,而不是 Powershell 或存储模块的代码问题。

我确实发现了另一个奇怪的问题,一些基于 USB 的存储,Initialize-Disk 失败,出现“...已初始化...”错误。这在各个地方都有记录。然而,对于某些 USB 存储设备,通过 Reset-PhysicalDisk 进行重置的典型推荐修复方法似乎在 Windows 11 下无法一致地工作。似乎有些 USB 存储设备的行为不一样,我想这并不奇怪。

至少对于我拥有的 15 个 USB 存储设备以及通过 eSATA、SATA 等连接的各种品牌和型号的 SSD 和 HDD 设备,似乎有效的方法是:

    #
    Clear-Disk -Number $theNumber -RemoveData -Confirm:$false

    # Documentation Suggests Reset, However Seems To Do Nothing On Some USB Storage Types...
    Reset-PhysicalDisk -FriendlyName (Get-PhysicalDisk -DeviceNumber $theNumber).FriendlyName 

    # Initalize-Disk Fails On Some USB Storage Types, Returns Initialization Is Already Complete...
    Initialize-Disk -Number $theNumber -PartitionStyle GPT -Confirm:$false -ErrorAction SilentlyContinue

    #
    New-Partition -DiskNumber $theNumber -UseMaximumSize -DriveLetter $theDrive | Out-Null

    #
    Format-Volume -DriveLetter $theDrive -FileSystem $theFileSystem -NewFileSystemLabel $theVolume -AllocationUnitSize $theSize -Force | Out-Null

使用 silentlycontinue 选项有点儿像 hack,但我还没有找到一种方法来测试给定磁盘是否已初始化但尚未格式化。仅测试“RAW”是不够的。在适当的情况下,您可以拥有一个在线但未初始化的磁盘,即非 RAW。

如果有人有 PowerShell 代码片段来明确测试处于准初始化但不处于 RAW 状态的磁盘,可能值得在这里分享。

相关内容