2009-05-01 2 views
3

Полностью новичку вопрос простой PowerShell Я пытаюсь сделать следующее - для каждого файла * .sql в текущем периоде каталогаКак использовать символ @ в powershell?

sqlplus username/[email protected]_identifier_specified_in_argument @file_name 

Вот то, что я до сих пор:

$scripts = dir *.sql 
foreach($script in $scripts) { 
    write-host sqlplus username/password"@"$args "@"$script.Name 
} 

(Я знаю, что write-host выводит его на экран, я просто пытаюсь отлаживать его сейчас)

Однако есть что-то напуганное, как powershell обрабатывает символ @, и когда я запускаю это, я всегда получаю что-то li ke

PS C:\code\scripts> C:\utils\run_sql_scripts_on.ps1 identifier 
sqlplus username/[email protected] @ ALERTS.sql 

Посмотрите, что пробел после "@"? Что дает?

ответ

6

Побег @ с выступом (`).

write-host sqlplus username/password`@$args `@$script.Name 
+0

Что делать 'и @ символы на самом деле делать? –

+2

Backtick - это символ escape в PowerShell. @ Можно использовать в PS для создания пустых массивов, например $ a = @(). В этом случае я не думаю, что проблема была @, а скорее двойные кавычки. Замените букву @ буквой, и вы все равно увидите дополнительное пространство. Я думаю, что Write-Host автоматически помещает пробел после строки с двумя кавычками. – aphoria

+3

Проблема в том, что PowerShell видел «@» и $ script.home как два отдельных аргумента, потому что второй - это выражение, а Write-Host объединяет все аргументы с пробелом. – JasonMArcher

2

PowerShell Community Extensions имеет удобную небольшую утилиту (echoargs) для отладки такого рода проблемы:

5>echoargs username/password"@"$args "@"$script.Name 
Arg 0 is <username/[email protected]> 
Arg 1 is <@> 
Arg 2 is <test.txt> 

Попробуйте убежать с кавычкой:

6>echoargs "username/password`@$args" "`@$($script.Name)" 
Arg 0 is <username/[email protected]> 
Arg 1 is <@test.txt>