Powershell экранирует специальные символы в переменной

#powershell

#powershell

Вопрос:

Я пытаюсь выполнить Copy-Item для ряда файлов и замечаю, что файлы, содержащие [ и ] , которые не копируются, однако я не получаю никакой ошибки.

Я использую следующую функцию:

 function fsync ($source,$target) {

    $sourceFiles = @(Get-ChildItem -Path $source -Recurse | select -expand FullName)

    foreach ($f in $sourceFiles) {
        $destFile = $f.Replace($source,$target)
        $exist = Test-Path $destFile

        if ($exist -eq $false) {
            Write-Host "Copying: " $f "to: " $destFile
            Copy-Item -Path "$f" -Destination "$destFile"
        } else {
            Write-Host "File: " $f "Already exists"
        }
    }
}
  

При каждом запуске он будет печатать Copying: C:Usersjesse_btmpfoo[1].txt to: C:Usersjesse_btmptestfoo[1].txt и не отображать ошибку, но файл фактически никогда не копируется.

Я пробовал заключать имена переменных в двойные кавычки, но это ничего не изменило.

Когда я вручную копирую файлы с помощью [ и ] в них на терминале, это работает до тех пор, пока эти символы экранируются. Есть ли что-то, что я должен сделать, чтобы мои переменные обрабатывались как литеральные строки?

Комментарии:

1. Передайте полный объект в copy item вместо расширения свойства full name

2. @DougMaurer: По-прежнему не работает

Ответ №1:

Странно, что это работает таким образом, но я видел похожие результаты на собственном опыте.
Используйте -LiteralPath:

 Copy-Item -LiteralPath $f.fullname -Destination "$destFile"
  

Комментарии:

1. На самом деле не так уж и странно, -Path допускает подстановочные знаки , хотя -LiteralPath это uh… литерал ( Copy-Item ).