2012-01-06 2 views
2

У меня есть следующий скрипт в Powershell ISE.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» в сценарии, и он прекрасно работает. В чем проблема струйной струны?

Update

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

Update

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

ответ

4

В 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; 
+0

Спасибо, эта разница действительно раздражает. Может ли '-split' принимать регулярное выражение, чтобы оно работало для среды? – ca9163d9

+0

@NicW да, уточните мой обновленный ответ – mjsr

+0

@NickW Да, может. Я приведу пример, как в моем ответе. Джон сделал всю тяжелую работу, поэтому он заслуживает принятого ответа здесь, но не стесняйтесь повышать ;-) –

2

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

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

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

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

Я запускаю их с использованием Powershell ISE. Вы пробовали его в ISE? – ca9163d9

+0

Вы правы, это происходит только в ISE. Это должно быть потому, что редактор помещает этот невидимый символ в конец каждой строки. Слава богу, консоль не делает то же самое; D – mjsr

3

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

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