Как заставить путь встроенного скрипта PowerShell распознавать пробелы?

Босс изменил серверы TFS и добавил пробел в path: D:\TFS Agent\xxx, что привело к сбою моего сценария PowerShell после выпуска.

У нас есть автоматическая интеграция сборки / выпуска с TFS, и у меня есть встроенная задача PowerShell для чтения файла и преобразования его в JSON, а затем выполнения некоторых SQL. У меня это работало до сегодняшнего утра.

Проблема в том, что путь агента - это системная переменная в TFS: $(System.DefaultWorkingDirectory), и я не уверен, как обрабатывать пространство в пути.

Я пробовал это:

# Begin inline script
Param(
    [string]$path,
    [string]$db,
    [string]$schema,
    [string]$envName
)
# Create module
$formattedPath = $path -replace " ", "` ";
$conv = Get-Content -Raw -Path "$formattedPath" | ConvertFrom-Json;

Но все, что я получаю, это D: \ TFS. До замены путь выглядит так:

D:\TFS Agent\_work\r3\a\xxx

Я хоть убей не могу понять, как заменить пробел галочкой или как игнорировать пробелы. Я новичок в PowerShell, так что это может быть простая вещь, но мой гугл-фу сегодня не силен. Любая помощь будет оценена по достоинству. Спасибо!


person dh6984    schedule 15.08.2018    source источник
comment
Может быть, это поможет: stackoverflow.com/a/18537263/8534630   -  person Arun    schedule 15.08.2018
comment
почему пространство на пути ломает вещи ..? Вы пытаетесь заменить пробел, потому что на фактическом пути нет пробела? Вы должны иметь возможность запустить это как есть: Get-Content -Path $path -Raw   -  person Maximilian Burszley    schedule 15.08.2018
comment
@ArunG Я смотрел на это раньше, и тут мне пришла идея заменить. Однако я не уверен, как реализовать амперсанд.   -  person dh6984    schedule 15.08.2018
comment
@ TheIncorrigible1 Я пробовал без кавычек вот так: $conv = Get-Content -Raw -Path $path | ConvertFrom-Json;, но получаю ту же ошибку: Cannot find path 'D:\TFS' because it does not exist. Кроме того, теперь в фактическом пути есть пробел, которого раньше не было.   -  person dh6984    schedule 15.08.2018
comment
@kiasta Есть ли в вашей переменной $path встроенные кавычки "?   -  person Maximilian Burszley    schedule 15.08.2018
comment
@ TheIncorrigible1 Это аргумент, передаваемый в задаче powershell в tfs: -path $(System.DefaultWorkingDirectory) в пути, переданном от меня, нет кавычек, но я не уверен в переменной.   -  person dh6984    schedule 15.08.2018
comment
Это переменная среды? У вас должен быть доступ к нему: $Env:DefaultWorkingDirectory   -  person Maximilian Burszley    schedule 15.08.2018
comment
@ TheIncorrigible1 Это было решение, поэтому очевидно, что происходило то, что журнал показывал правильный путь, но когда я писал-вывод $ path, он по какой-то причине был усечен до D: \ TFS. Я использовал $ env: SYSTEM_DEFAULTWORKINGDIRECTORY, и это отлично сработало. Большое спасибо!   -  person dh6984    schedule 15.08.2018
comment
Путь до замены выглядит следующим образом: D:\TFS Agent\_work\r3\a\xxx Какие у вас есть доказательства этого? Ваша -replace операция фактически бесполезна. Он заменяет пространство пространством. Если вы получаете только D:\TFS в результате, это означает, что у вас есть только это с самого начала.   -  person user4003407    schedule 15.08.2018
comment
@PetSerAl Из самого журнала TFS он показывал правильный путь для аргумента, и я никогда не записывал-вывод переменной $ path, потому что предполагал, что он передает правильный путь: 2018-08-15T14:59:16.3135448Z ##[debug]Write-Output $path' 2018-08-15T14:59:16.3165515Z ##[debug]Env:INPUT_SCRIPTARGUMENTS: '-path D:\TFS Agent\_work\r3\a' 2018-08-15T14:59:16.3465484Z ##[command]& 'D:\TFS Agent\_work\_temp\tmp14B7.ps1' -path D:\TFS Agent\_work\r3\a 2018-08-15T14:59:16.3605498Z D:\TFS Но я написал вывод, и он был усечен.   -  person dh6984    schedule 15.08.2018
comment
-path D:\TFS Agent\_work\r3\a Как вы думаете, почему это передаст D:\TFS Agent\_work\r3\a в параметр -path, но не D:\TFS будет передано в -path параметр, а Agent\_work\r3\a будет передано как позиционный аргумент? В конце концов, пробел - это разделитель аргументов. Кроме того, если вы думаете, что Write-Output $path обрезает отображаемый вывод, то почему бы не напечатать что-нибудь еще, например $path.Length?   -  person user4003407    schedule 15.08.2018
comment
Ваша замена ничего не делает - первые кавычки " " - это пробел, а вы заменяете его вторым "` ", который является escape-последовательностью PowerShell, и только специальные символы имеют какое-либо значение с escape-обратным знаком - "`n", например, как новая строка. Другие символы, такие как пробел, не заменяются обратной кавычкой и заканчиваются тем же самым. Итак, вы заменяете пробел пробелом, который ничего не меняет.   -  person TessellatingHeckler    schedule 15.08.2018


Ответы (1)


Кажется, вы передали $ (System.DefaultWorkingDirectory) с путем к переменной, как показано ниже:

-path $(System.DefaultWorkingDirectory)

В то время как, если $(System.DefaultWorkingDirectory) содержит пробелы (например, D:\TFS Agent\_work\r3\a), он будет отображать разделенные значения на разные строки пробелами (например, D:\TFS Agent\_work\r3\a будет отображаться в двух строках со значением D:\TFS и Agent\_work\r3\a). Итак, переменная $path со значением в первой строке (например, D:\TFS).

Чтобы решить эту проблему, вам просто нужно добавить двойные кавычки для $(System.DefaultWorkingDirectory). Поэтому просто измените аргумент в задаче PowerShell как:

-path "$(System.DefaultWorkingDirectory)"
person Marina Liu    schedule 18.08.2018