Hello Stackoverflow用户,
我是脚本和PowerShell的小伙伴。
我有以下脚本将主机上的所有驱动器号都转换为文本文件。我需要通过执行测试路径将正确的驱动器号写入变量。但它不起作用。我知道我很亲密,但无法让它发挥作用。 有谁知道如何修复脚本?
Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select DeviceID | Format-Table -HideTableHeaders > c:\DeviceID.txt -Force
$DeviceID = Get-Content C:\DeviceID.txt
$DeviceID | ForEach {$_.TrimEnd()} | ? {$_.trim() -ne '' } > c:\DeviceID.txt
$DeviceID = Get-Content C:\DeviceID.txt
$Path = "$_\Apps\NetprobeNT\"
$PathExists = Test-Path $Path
foreach ($DeviceID in $DeviceID)
{
If ($PathExists -eq $True)
{
$DeviceDrive = $DeviceID}
Else
{
$DeviceDrive = "C:"}
}
我认为以下几行是问题
$Path = "$_\Apps\NetprobeNT\"
有关如何使其发挥作用的任何想法?
这与PowerShell - drive variable有关,以获取更多信息。
提前谢谢。
答案 0 :(得分:1)
正如你自己指出的那样,这条线存在问题:
$Path = "$_\Apps\NetprobeNT"
$_
未在此范围内定义,因此生成的字符串变为"\Apps\NetprobeNT"
我会在Join-Path
内使用Where-Object
(其中$_
将引用管道中的当前项目):
要查找文件夹所在的驱动器,您可以使用Where-Object
:
$CorrectDrive = $DeviceIDs |Where-Object {
Test-Path $(Join-Path $_ "Apps\NetprobeNT")
}
if(-not $CorrectDrive)
{
$CorrectDrive = "C:"
}
话虽如此,您获取DeviceID的方法非常复杂 - 只需使用Select-Object -ExpandProperty
来获取DeviceID值即可:
$DeviceIDs = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3 AND DeviceID!='C:'" |Select-Object -ExpandProperty DeviceID