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

时间:2018-09-12 13:55:58

标签: string powershell path powershell-v5.0 new-item

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

具有讽刺意味的是,当我复制并粘贴变量的内容并手动创建一个新项目-path并粘贴所述内容时,它可以工作,但是当我使用该变量时,它却没有... 我的目标的简短摘要,我将获得一个标记为ORIGINAL的USB,并获取当时插入的每个USB的S / N,并为每个文件创建单独的日志文件,其标题由SERIALNUMBER_DATE_TIME.txt组成,这些文件均在ORIGINAL USB < / p>

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

FYI $LogPathSystem.String而非对象 $TargetUSBs充满了插入系统的所有USB驱动器

这种在路径上使用变量的方法通常对我来说效果很好,只是区别是我这次使用的此处字符串是否引起我的问​​题?我希望不是因为我真的不想在一行上全部填写该变量。 New-Item's帮助文件针对<String[]>参数显示了-path,这是否意味着我必须使用字符串数组?如果可以的话,如何将其转换为正常工作?

1 个答案:

答案 0 :(得分: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"
}