New-item "Illegal Characters in path" 当我使用包含此处字符串的变量时

New-item "Illegal Characters in path" when I use a Variable that contains a here string

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

具有讽刺意味的是,当我复制并粘贴我的变量的内容并手动创建一个 new-item -path 并粘贴所述内容时它有效但是当我使用该变量时它不...... 我的目标的简要总结我正在使用一个标有 ORIGINAL 的 USB 并获取当时插入的每个 USB 的 S/N,并为每个标题创建单独的日志文件,这些文件的标题由 SERIALNUMBER_DATE_TIME.txt 组成,这些文件已创建在原始 USB

$LogPath 包含例如以下内容:E:\Mattel49721369_2018912_93427.txt 然而,当我在 New-item 中使用变量时,它表示 "Illegal characters in Path"

仅供参考 $LogPathSystem.String 而不是 object $TargetUSBs 已填满所有插入系统的 USB 驱动器

这种使用变量作为路径的方法通常对我来说效果很好,唯一的区别是我这次使用的 here-string 这会导致我的问题吗?我希望不会,因为我真的不想在一行中填满那个变量。 New-Item's 帮助文件为 -path 参数显示 <String[]> 这是否意味着我必须使用字符串数组?如果是这样,我该如何转换它才能让它发挥作用?

你的问题是 Windows 使用 CRLF 行结尾(仅限 Unix LF),所以你的路径中仍然有 CR 个字符。

要解决此问题,只需使用:

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

但是您可以轻松地简化您的代码,这样您就不需要混乱的此处字符串或 replace/trim...

通过使用单个 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"
}