String 在Powershell中将字符串变量作为参数传递

String 在Powershell中将字符串变量作为参数传递,string,powershell,wmi,wmic,String,Powershell,Wmi,Wmic,我正在尝试编写一个PowerShell脚本,以将I:的驱动器号更改为其他内容。这是剧本 $driveI = Get-WmiObject -Class win32_volume -Filter "DriveLetter='I:'" if ($driveI.SerialNumber=""){ write-host "I: is free..." } else { write-host "I: is occupied" foreach ( $s in @("'Z:

我正在尝试编写一个PowerShell脚本,以将I:的驱动器号更改为其他内容。这是剧本

$driveI = Get-WmiObject -Class win32_volume -Filter "DriveLetter='I:'"

if ($driveI.SerialNumber=""){

    write-host "I: is free..."

}   else  {

    write-host "I: is occupied"
    foreach ( $s in @("'Z:'", "'Y:'", "'X:'", "'W:'", "'V:'", "'U:'", "'T:'", "'R:'", "'Q:'", "'P:'", "'O:'", "'N:'", "'M:'", "'L:'", "'K:'", "'J:'", "'H:'", "'G:'", "'F:'", "'E:'", "'D:'", "'B:'", "'A:'"))
    {
        $testdrv = Get-WmiObject -Class win32_volume -Filter "DriveLetter=$s"

        if (!$testdrive.Exist)
        {
            $s = '"'+$s.Trim([char]0x0027)+'"'
            Set-WmiInstance -input $driveI -Arguments @{DriveLetter=$s}
            Write-Host I: has been moved to $s
            break
        }
    }
}
请允许我带你看一下剧本<代码>$driveI用于检索有关I:的所有信息。现在,如果I:没有序列号,则表示I:不存在。 另一方面,如果I:存在,我将尝试查找一个免费的驱动器号。我正在用
foreach
循环实现我的搜索。现在,当我们调用
getwmiobject
时,我们使用带单引号的驱动器号。但是当我们使用
设置WmiInstance
时,我们使用双引号。但是,即使我将
$s
修改为用双引号括起来,它也不起作用。
简而言之,如果我使用
写主机$s
,我会得到输出,比如说,
“E:”
。当我使用
setwmiinstance-input$driveI-Arguments@{DriveLetter=“E:”}
时,它可以工作。但是当我使用
setwmiinstance-input$driveI-Arguments@{DriveLetter=$s}
时,它不起作用。谁能告诉我我做错了什么吗?

以后要删除引号时,请不要在字符串中加引号。而是在实际需要的地方添加引号:

$driveLetters='Z:'、'Y:'、'X:'、…、'D:'、'B:'、'A:'
foreach($s,单位为$driveLetters){
$testdrv=Get WmiObject-Class Win32_Volume-Filter“DriveLetter=”$s“
如果(-not$testdrv){
Set WmiInstance-input$driveI-Arguments@{DriveLetter=$s}
写入主机“I:已移动到$s”
打破
}
}

这有点笨拙,但此代码有效。我会采纳你的建议,把那些乱七八糟的东西处理掉

$driveI = Get-WmiObject -Class win32_volume -Filter "DriveLetter='I:'"

if ($driveI -eq $null)  {

    write-host "I: is free..."

}  else    {    
    write-host "I: is occupied..."
    foreach ( $s in @("'Z:'", "'Y:'", "'X:'", "'W:'", "'V:'", "'U:'", "'T:'", "'R:'", "'Q:'", "'P:'", "'O:'", "'N:'", "'M:'", "'L:'", "'K:'", "'J:'", "'H:'", "'G:'", "'F:'", "'E:'", "'D:'", "'B:'", "'A:'"))
    {
        $testdrv = Get-WmiObject -Class win32_volume -Filter "DriveLetter=$s"

        if ($testdrv -eq $null)
        {
            $s = $s.Trim([char]0x0027)
            Set-WmiInstance -input $driveI -Arguments @{DriveLetter=$s}
            Write-Host I: has been moved to $s
            break
        }
    }
}

在您的工作示例中,您正在传递一个字符串,该字符串被引用为定义文本字符串的方式。在非工作示例中,您正在传递一个字符串,其中您正在用引号编码。我想知道这是否是问题所在,因为没有名为
“E:
的驱动器,但实际上只有
E:
。如果将行更改为
$s=$s.Trim([char]0x0027)
,会发生什么情况?将驱动器号定义为简单字符串<代码>$s在@(“Z:”,“Y:”,…中,然后您的过滤器将如下所示:
-filter“DriveLetter='$s'”
并且您可以摆脱整个
$s=''+$s.Trim([char]0x0027)+''
混乱。