Я пытаюсь написать сценарий 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}
, он не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно?
В вашем рабочем примере вы передаете строку, которая цитируется так, как вы определяете буквенную строку. В нерабочем примере вы передаете строку, в которой вы кодируете кавычки. Интересно, если это проблема, поскольку нет диска с именем «E:», но на самом деле просто «E:». Что произойдет, если вы измените строку на '$ s = $ s.Trim ([char] 0x0027)'? – Matt
Определите буквы дисков как простые строки ... '$ s in @ (" Z: "," Y: ", ....' Тогда ваш фильтр будет выглядеть так: '-Filter 'DriveLetter =' $ s ' ", и вы можете избавиться от всего' $ s = '"' + $ s.Trim ([char] 0x0027) + '' '' mess. –