PowerShell ISE "Недопустимые символы в пути" при передаче путей к test-path? - PullRequest
2 голосов
/ 07 января 2012

У меня есть следующий скрипт в Powershell ISE .

cd E:\Data
@"
xxxx.zip
yyyy.zip
"@ -split "`n" | % { echo "'$_'"; test-path -path "$_" -EA Stop }

Однако всегда возникает ошибка.

'xxxx.ZIP'
False
Illegal characters in path.
At line:175 char:27
+ % { echo "'$_'"; test-path <<<<  -path "$_" -EA Stop }
    + CategoryInfo          : InvalidArgument: (E:\Data\xxxx.ZIP:String) [Test-Path], ArgumentException
    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.TestPathCommand

Однако я могу запустить Test-Path -path xxxx.zip или просто жесткий код 'xxxx.zip' в скрипте, и он работает нормально. В чем проблема конвейерной строки?

Обновление

Если я изменю последний скрипт на % { echo "'$_'"; "test-path -path $_ -EA Stop" } и скопирую / вставлю вывод ("test-path -path xxxx.ZIP -EA Stop") в командную строку. Оно работает.

Обновление

Кажется, это работает в консоли powershell. Ошибка ISE?

Ответы [ 3 ]

4 голосов
/ 07 января 2012

В ISE строка здесь должна быть разделена с использованием возврата каретки , за которым следует новая строка powershell , например:

cd E:\Data
@"
xxxx.zip
yyyy.zip
"@ -split "`r`n" | % { echo "'$_'"; test-path -path "$_" -EA Stop }

При использовании этой функции:

function asciiToHex($a)
{
$b = $a.ToCharArray();
Foreach ($element in $b) {$c = $c + "%#x" + [System.String]::Format("{0:X}",
[System.Convert]::ToUInt32($element)) + ";"}
$c
}

для преобразования строки здесь в ise мы получаем:

asciitohex $t
%#x78;%#x78;%#x78;%#x78;%#x2E;%#x7A;%#x69;%#x70;%#xD;%#xA;%#x79;%#x79;%#x79;%#x79;%#x2E;%#x7A;%#x69;%#x70;

однако в консоли powershell мы получаем

asciitohex $t
%#x78;%#x78;%#x78;%#x78;%#x2E;%#x7A;%#x69;%#x70;%#xA;%#x79;%#x79;%#x79;%#x79;%#x2E;%#x7A;%#x69;%#x70;
3 голосов
/ 07 января 2012

Пример для работы в ISE и консоли, используя регулярное выражение с -split.

cd C:\
@"
xxxx.zip
yyyy.zip
"@ -split "`r`n|`n" | % { echo "'$_'"; test-path -path "$_" -EA Stop }
2 голосов
/ 07 января 2012

Вы уверены, что это именно тот сценарий, который вы выполняете? Я не могу воспроизвести проблему.

NTCs>  @"
>> xxxx.zip
>> yyyy.zip
>> "@ -split "`n"|%{echo "'$_'";test-path -path "$_" -ea stop}
>>
'xxxx.zip'
False
'yyyy.zip'
False

Обновлено Для работы в ISE и консоли поставьте возвращаемый символ со знаком вопроса (0 или 1 вхождение):

  @"
 xxxx.zip
 yyyy.zip
 "@ -split "`r?`n"|%{echo "'$_'";test-path -path "$_" -ea stop}
...