2015-05-11 2 views
1

Я пытаюсь написать сценарий PowerShell, чтобы изменить букву диска I: на что-то другое. Вот сценарий.Передача строковой переменной как аргумент в Powershell

$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: не существует. Если, с другой стороны, я: существует, я пытаюсь найти бесплатную букву диска. Я реализую свой поиск с помощью цикла foreach. Теперь, когда мы вызываем Get-WmiObject, мы используем буквы дисков с одинарной кавычкой. Но когда мы используем Set-WmiInstance, мы используем двойные кавычки. Однако, даже когда я изменяю $s, чтобы обернуть двойную кавычку, это не сработает. Короче говоря, если я использую Write-Host $s, я получаю вывод, скажем, "E:". Когда я использую Set-WmiInstance -input $driveI -Arguments @{DriveLetter="E:"}, он работает. Но когда я использую Set-WmiInstance -input $driveI -Arguments @{DriveLetter=$s}, он не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+1

В вашем рабочем примере вы передаете строку, которая цитируется так, как вы определяете буквенную строку. В нерабочем примере вы передаете строку, в которой вы кодируете кавычки. Интересно, если это проблема, поскольку нет диска с именем «E:», но на самом деле просто «E:». Что произойдет, если вы измените строку на '$ s = $ s.Trim ([char] 0x0027)'? – Matt

+1

Определите буквы дисков как простые строки ... '$ s in @ (" Z: "," Y: ", ....' Тогда ваш фильтр будет выглядеть так: '-Filter 'DriveLetter =' $ s ' ", и вы можете избавиться от всего' $ s = '"' + $ s.Trim ([char] 0x0027) + '' '' mess. –

ответ

2

Не помещайте кавычки в строки, когда вы собираетесь удалить их позже в любом случае. Вместо этого добавьте цитаты, в которых они вам действительно нужны:

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

Это немного неуклюжий, но этот код работает. Я возьму ваши предложения и избавлюсь от беспорядка 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 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^