0
foreach ($Target in $TargetUSBs)
{
$LogPath= @"
$SourceUSB\$(((Get-CimInstance -ClassName Win32_volume)|where {$_.DriveType -eq "2" -and $_.DriveLetter -eq $Target}).SerialNumber)_
$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Year)$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Month)
$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Day)_$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Hour)
$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Minute)$(((Get-CimInstance -ClassName Win32_OperatingSystem).LocalDateTime).Second).txt
"@

    $LogPath = $LogPath.Replace("`n","").Trim()
    New-item -Path "$LogPath"
}

具有讽刺意味的是,当我复制并粘贴变量的内容并手动创建一个新项目路径并粘贴所述内容时,它可以工作,但是当我使用该变量时,它不会......我的目标的简要总结我正在使用 USB标记为 ORIGINAL 并获取当时插入的每个 USB 的 S/N,并为每个文件创建单独的日志文件,标题由 SERIALNUMBER_DATE_TIME.txt 组成,这些文件在 ORIGINAL USB 中创建

$LogPath包含例如以下内容:E:\Mattel\1949721369_2018912_93427.txt 然而,当我在新项目中使用变量时,它表明"Illegal characters in Path"

仅供参考$LogPathSystem.String不是一个对象 $TargetUSBs,其中填充了插入系统的所有 USB 驱动器

这种将变量用于路径的方法通常对我来说很好,唯一的区别是我这次使用的here-string这会导致我的问题吗?我希望不是因为我真的不想在一行上填充那个变量。New-Item'shelpfiles 显示<String[]>参数-path是否意味着我必须使用字符串数组?如果是这样,我该如何转换它以使其工作?

4

1 回答 1

0

您的问题是 Windows 使用CRLF行尾(仅限 Unix LF),因此您的路径中仍然有CR字符。

要解决这个问题,只需使用:

.Replace("`r`n","")

但是,您可以轻松地简化代码,因此您不需要凌乱的此处字符串或替换/修剪...

通过使用单个Get-Date调用,您可以将其格式化为所需的输出。这意味着您可以将其构建Path为一个简单的字符串,并且涉及的代码要少得多:

foreach ($Target in $TargetUSBs)
{
    $SerialNumber = Get-CimInstance -ClassName Win32_volume | where {$_.DriveType -eq "2" -and $_.DriveLetter -eq $Target} | Select-Object -ExpandProperty SerialNumber
    $DateTime = Get-Date -Format "yyyyMd_Hms"

    New-item -Path "$SourceUSB\$SerialNumber_$DateTime.txt"
}
于 2018-09-12T14:47:00.733 回答