当我使用包含此字符串的变量时,新项“路径中的非法字符”

问题描述 投票:0回答:1
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驱动器

这种为路径使用变量的方法通常对我来说很好但只是差异就是这里我用过的字符串这会导致我的问题吗?我希望不是因为我真的不想在一行填写该变量。 New-Item's helpfiles为<String[]>参数显示-path这是否意味着我必须使用字符串数组?如果是这样,我如何将其转换为使其工作?

string powershell path powershell-v5.0 new-item
1个回答
0
投票

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

要解决这个问题,请使用:

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

但是,您可以轻松简化代码,因此您不需要乱码here-string或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"
}
© www.soinside.com 2019 - 2024. All rights reserved.