Новый элемент "Недопустимые символы в пути", когда я использую переменную, содержащую строку здесь - PullRequest
0 голосов
/ 12 сентября 2018
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 и вставляю содержимое, которое работает, но когда я использую переменную, это не так ... Краткое описание моей цели Я беру USB с маркировкой ORIGINAL и получаю S / N каждого USB, подключенного в то время, и создаю отдельные файлы журнала для каждого с заголовком, состоящим из SERIALNUMBER_DATE_TIME.txt, и эти файлы создаются в ORIGINAL USB

$LogPath содержит, например, следующее: E:\Mattel\1949721369_2018912_93427.txt Тем не менее, когда я использую переменную в New-item, это означает "Illegal characters in Path"

FYI $LogPath является System.String не объектом $TargetUSBs заполнен всеми USB-накопителями, подключенными к системе

этот метод использования переменной для пути, как правило, работает для меня нормально, только разница в том, какая строка здесь я использовал в этот раз, вызывает ли это мою проблему? Я надеюсь, что нет, потому что я действительно не хочу заполнять эту переменную одной строкой. New-Item's helpfiles показывает <String[]> для параметра -path означает ли это, что я должен использовать строковый массив? и если да, то как мне преобразовать это, чтобы это работало?

1 Ответ

0 голосов
/ 12 сентября 2018

Ваша проблема в том, что Windows использует CRLF окончания строк (только для Unix LF), поэтому на вашем пути все еще есть CR символов.

Чтобы исправить это, просто используйте:

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

Однако вы можете легко упростить свой код, чтобы вам не требовалась грязная строка или заменить / обрезать ...

Используя один вызов 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"
}
...