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"
仅供参考$LogPath
是System.String
不是对象$TargetUSBs
充满了插入系统的所有USB驱动器
这种为路径使用变量的方法通常对我来说很好但只是差异就是这里我用过的字符串这会导致我的问题吗?我希望不是因为我真的不想在一行填写该变量。 New-Item's
helpfiles为<String[]>
参数显示-path
这是否意味着我必须使用字符串数组?如果是这样,我如何将其转换为使其工作?
你的问题是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"
}