【问题标题】:Passing string variable as Argument in Powershell在Powershell中将字符串变量作为参数传递
【发布时间】:2015-05-11 15:47:31
【问题描述】:

我正在尝试编写一个 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 循环实现我的搜索。现在,当我们调用Get-WmiObject 时,我们使用带单引号的驱动器号。但是当我们使用Set-WmiInstance 时,我们使用双引号。但是,即使我将$s 修改为用双引号括起来,它也不起作用。 简而言之,如果我使用Write-Host $s,我会得到输出,比如"E:"。当我使用Set-WmiInstance -input $driveI -Arguments @{DriveLetter="E:"} 时,它可以工作。但是当我使用Set-WmiInstance -input $driveI -Arguments @{DriveLetter=$s} 时,它不起作用。谁能告诉我我做错了什么?

【问题讨论】:

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

标签: string powershell wmi wmic


【解决方案1】:

无论如何,当您稍后要删除它们时,不要在字符串中加上引号。而是在您实际需要的地方添加引号:

$driveLetters = 'Z:', 'Y:', 'X:', ..., 'D:', 'B:', 'A:'
foreach ( $s in $driveLetters ) {
    $testdrv = Get-WmiObject -Class Win32_Volume -Filter "DriveLetter='$s'"

    if (-not $testdrv) {
        Set-WmiInstance -input $driveI -Arguments @{DriveLetter=$s}
        Write-Host "I: has been moved to $s"
        break
    }
}

【讨论】:

    【解决方案2】:

    这有点笨拙,但这段代码有效。我会采纳你的建议,并摆脱Trim 的混乱。

    $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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多