Почему Powershell заменяет запятые пробелами? - PullRequest
2 голосов
/ 15 октября 2011

Я делаю какой-то скрипт в Powershell для автоматизации задачи. Этот скрипт получит аргументы, такие как:

PS > myscript.ps1 par=a,1,2,0.1 par=b,3,4,0.1 par=c,5,6,0.1 bin=file.exe exeargs="fixed args for file.exe"

Короче говоря, file.exe - это исполняемый файл, который принимает параметры (включая a, b и c), и этот скрипт ps1 выполнит file.exe, передав аргументы a, b и c в пределах указанного диапазон, варьирующий их с заданной точностью.

Вопрос в том, что сначала я делю каждый $arg in $args на символ "=", а затем я должен разделить их на ",", чтобы получить указанные значения.

Дело в том, когда я делаю:

foreach ($arg in $args)
{
    $parts = ([string] $arg).split("=")
    Write-Host $parts[1]
}

Выход

a 1 2 0.1
b 3 4 0.1
c 5 6 0.1
file.exe
fixed args for file.exe

То есть, он уже заменял символ "," пробелом, поэтому мой второй сплит должен быть с пробелом, а не с запятой.

Есть предположения, почему это происходит?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Прежде всего, почему вы пишете это как программу на C или что-то в этом роде? Вам не нужно передавать подобные аргументы, использовать $args и разделять на = и т. Д., Когда Powershell имеет более мощную концепцию параметров, благодаря которой вы можете передавать именованные параметры и аргументы, а не выполнять анализ, которым вы являетесь делает. (Подробнее о параметрах здесь: http://technet.microsoft.com/en-us/library/dd315296.aspx)

С учетом сказанного, позвольте мне ответить на ваш вопрос:

Что вы делаете, когда передаете такие аргументы, как:

par=a,1,2,0.1 par=b,3,4,0.1 par=c,5,6,0.1 bin=file.exe exeargs="fixed args for file.exe"

вы передаете массив массивов. Первый элемент - это массив с элементами:

par=a
1
2
0.1

Хорошо подходит к расколу:

Когда вы делаете [string] $a, вы конвертируете массив в строку. По умолчанию это означает, что массив с элементами 1,2,3 станет 1 2 3.

Таким образом, ваш первый аргумент par=a,1,2,0.1 становится par=a 1 2 0.1, а разделение на = означает, что parts[1] становится a 1 2 0.1, что вы и видите.

Так как же вы можете оставить запятую?

Просто создайте массив для преобразования в строку с , между пробелами, верно?

Вот несколько способов сделать это:

Использование оператора -join:

foreach ($arg in $args)
{

    $parts = ($arg -join ",").split("=")
    Write-Host $parts[1]
}

Теперь вы увидите вывод с запятыми, которые вы хотите.

Другой способ, используя $ofs специальную переменную:

foreach ($arg in $args)
{
    $ofs =","
    $parts = ([string] $arg).split("=")
    Write-Host $parts[1]
}

(подробнее о $ здесь: http://blogs.msdn.com/b/powershell/archive/2006/07/15/what-is-ofs.aspx)

Отказ от ответственности - Все это объяснение, чтобы вы поняли, что происходит. Пожалуйста, не продолжайте это и используйте параметры.

2 голосов
/ 15 октября 2011

Это происходит при разборе командной строки вашего скрипта, а не во время метода split (). Чтобы увидеть это, попробуйте вначале написать «Write-Host $ args», например:

Write-Host $args
foreach ($arg in $args)
{
    $parts = ([string] $arg).split("=")
    Write-Host $parts[1]
}

Это потому, что символ ',' используется для разделения элементов в массиве. Например:

PS C:\temp> $a = 1,2,3
PS C:\temp> Write-Host $a
1 2 3
PS C:\temp> $a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Попробуйте использовать вместо этой командной строки:

.\myscript.ps1 "par=a,1,2,0.1" "par=b,3,4,0.1" "par=c,5,6,0.1" "bin=file.exe" "exeargs=fixed args for file.exe"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...