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"
仅供参考 $LogPath
是 System.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"
}
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"
仅供参考 $LogPath
是 System.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"
}