将.bat转换为.ps1以在Windows 10工作站上查找可移动USB驱动器[重复]

问题描述 投票:-3回答:2

这个问题在这里已有答案:

几年前我在互联网上找到了以下代码来搜索Window 7工作站上的任何USB可移动驱动器(记忆棒)。我仍然不完全理解“/ F”,“tokens = 1 *”,“tokens = 3”,“in(fsutil fsinfo drives)”和“in(fsutil fsinfo drivetype %% c)”。

现在我有一个新的Windows 10工作站,需要转换为PowerShell 5.任何人都可以帮助我开始如何将此.bat转换为.ps1?

我在... Major 5 Minor 1 Build 16299 修订版98

@echo off
echo Workstation backup
:tryAgain
set isUSBfound=false
for /F "tokens=1*" %%a in ('fsutil fsinfo drives') do (
   for %%c in (%%b) do (
      for /F "tokens=3" %%d in ('fsutil fsinfo drivetype %%c') do (
         if %%d equ Removable (
            echo Drive %%c is Removable (USB^)
        call "F:\scripts\backups\Backup.bat" %%c
            set isUSBfound=true
         ) 
      )
   )
)
if not %isUSBfound%==true ( 
   echo USB drive not found.  Enter USB drive and press enter to try again. 
   pause
   goto tryAgain
)
date /t
time /t
pause
powershell usb
2个回答
0
投票

您可以执行wmi调用,为您提供以下信息:

$UsbDrives = Get-WmiObject -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"'

If ($UsbDrives)
{
    ForEach ($Drive in $UsbDrives)
    {
        Write-Output "Drive '$($Drive.Caption)' is removable"
    }
}
Else
{
    Write-Output 'USB drive not found. Enter a USB and try again.'
}

0
投票

由于你需要从接口类型的磁盘驱动器走到驱动器号所在的逻辑磁盘的距离有多远,但是较新的CIM cmdlet仍然比使用Get-WMIObject执行所有操作更容易:

Get-CimInstance -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' | 
    Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition |
    Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk |
    Format-List *

要么:

Get-CimInstance -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' |
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition |
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition |
    Format-List *

命令是等效的。

如果您使用的是PowerShell v2.0,则无法访问Get-Cim* cmdlet。试试这个:

Get-WmiObject -Class Win32_DiskDrive -Filter 'InterfaceType = "USB"' |
    ForEach-Object {
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""$($_.DeviceID.Replace('\','\\'))""} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
    } | ForEach-Object {
        Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""$($_.DeviceID.Replace('\','\\'))""} WHERE AssocClass = Win32_LogicalDiskToPartition"
    } |
    Format-List *

您可能还需要Win32_Volume中存在的一些信息,但无法将上述三个类(Win32_DiskDrive,Win32_DiskPartition和Win32_LogicalPartition)直接映射到Win32_Volume。这是因为Win32_Volume表示卷装入点,这不是其他三个类中的概念。前三个类使用the WinCIM32 provider,而后者使用storage volume provider。在开始匹配之前,请注意您了解所查看的系统类型,因为它们不一定指的是相同类型的事物。存储卷提供程序是在Windows 7和Server 2008 R2中引入的,因此在此之前将无法使用Win32_Volume类。

© www.soinside.com 2019 - 2024. All rights reserved.