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

4384
Samir

Когда я щелкаю правой кнопкой мыши по script.ps1файлу и выбираю «Запускать с PowerShell», открывается окно консоли PS, и по какой-то причине мой сценарий не запускается. Таким образом, я получаю сообщение об ошибке, но не могу прочитать сообщение, потому что окно закрывается сразу после появления ошибки.

Поэтому я хотел бы открыть новое окно консоли PowerShell, перейти к файлу сценария, запустить его и, надеюсь, на этот раз получить удовольствие от чтения глупого сообщения об ошибке. Так как мне запустить скрипт из окна консоли?

  • Версия ОС: Windows 8.0
  • PS версия: 3.0

Простой ввод script.ps1или предлагаемый ".\script.ps1"просто ничего не делает.

a

Так что я полагаю, что нужно получить какую-то команду? Сценарий очень прост, он должен создавать новые папки и называть их, читая Export.txtфайл.

$folder="C:\test"; $txtFile="C:\test\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

Заметка! Обратите внимание, что приведенное выше сообщение об ошибке (скриншот) не относится к запуску самого скрипта. Единственный способ запустить сценарий - щелкнуть правой кнопкой мыши файл сценария в Проводнике и выбрать «Запуск с PowerShell», и ошибка, которую я получаю при его запуске, отличается от той, которую вы видите здесь выше.

Обновить! Смотрите мой второй комментарий ниже. Для путей, как C:\test\script.ps1это делает работу с .\script.ps1. Мне по-прежнему нужна помощь по запуску файла сценария PS, когда путь к файлу сценария включает в себя такие буквы, как Å, Ä и Ö.

Обновление - Е, А и Е ломает PS

Как я уже сказал, у меня, похоже, проблемы с этими персонажами в PS. Вот почему я изначально думал, что я делаю это неправильно. Итак, здесь я приведу два примера, чтобы продемонстрировать это.

Запуск сценария PS без Å, Ä и Ö

Это мой сценарий.

$folder="C:\test"; $txtFile="C:\test\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

Это содержимое того места, где я сейчас его тестирую.

PS C:\test> dir   Directory: C:\test   Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2014-02-28 09:12 3648 Export.txt -a--- 2014-02-28 10:49 162 script.ps1   PS C:\test> 

Это я запускаю скрипт из окна консоли PS.

PS C:\test> .\script   Directory: C:\test   Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2014-02-28 10:55 001 Harberget d---- 2014-02-28 10:55 004 Badstuknappen d---- 2014-02-28 10:55 005 Aspberget d---- 2014-02-28 10:55 006 Knipen d---- 2014-02-28 10:55 011 Juberget d---- 2014-02-28 10:55 012 Rangen d---- 2014-02-28 10:55 014 Grasbricka d---- 2014-02-28 10:55 018 Letafors d---- 2014-02-28 10:55 020 Rya d---- 2014-02-28 10:55 022 Bograngen d---- 2014-02-28 10:55 023 Dalby d---- 2014-02-28 10:55 029 Transtrand d---- 2014-02-28 10:55 032 Viggen d---- 2014-02-28 10:55 033 Nyskoga d---- 2014-02-28 10:55 044 Vitsand d---- 2014-02-28 10:55 059 Lekvattnet d---- 2014-02-28 10:55 064 Gustavsfors d---- 2014-02-28 10:55 066 Tyfors d---- 2014-02-28 10:55 067 Mitandersfors d---- 2014-02-28 10:55 070 Bada d---- 2014-02-28 10:55 073 Geijersholm d---- 2014-02-28 10:55 074 Liljendal d---- 2014-02-28 10:55 077 Bogen d---- 2014-02-28 10:55 079 Grinnemo d---- 2014-02-28 10:55 080 Lysvik d---- 2014-02-28 10:55 082 Uddeholm d---- 2014-02-28 10:55 085 Vitklinten d---- 2014-02-28 10:55 086 Gravendal d---- 2014-02-28 10:55 087 Magnor d---- 2014-02-28 10:55 089 Bortan d---- 2014-02-28 10:55 090 Fredros d---- 2014-02-28 10:55 095 Busken d---- 2014-02-28 10:55 101 Charlottenberg d---- 2014-02-28 10:55 102 Allstakan d---- 2014-02-28 10:55 104 Rotten d---- 2014-02-28 10:55 105 Sunne d---- 2014-02-28 10:55 106 Annefors d---- 2014-02-28 10:55 107 Munkfors d---- 2014-02-28 10:55 108 Sunnemo d---- 2014-02-28 10:55 109 Nordmarker d---- 2014-02-28 10:55 111 Silvergruva d---- 2014-02-28 10:55 113 Skillingemark d---- 2014-02-28 10:55 115 Gunnarsskog d---- 2014-02-28 10:55 116 Mangskog d---- 2014-02-28 10:55 118 Rottneros d---- 2014-02-28 10:55 123 Persberget d---- 2014-02-28 10:55 124 Hellefors d---- 2014-02-28 10:55 125 Bottnar d---- 2014-02-28 10:55 128 Ottebol d---- 2014-02-28 10:55 129 Rackstad d---- 2014-02-28 10:55 130 Gullesbyn d---- 2014-02-28 10:55 131 Emtervik d---- 2014-02-28 10:55 135 Brattfors d---- 2014-02-28 10:55 136 Filipstad d---- 2014-02-28 10:55 137 Saxhyttan d---- 2014-02-28 10:55 138 Orrkullen d---- 2014-02-28 10:55 142 Arvika d---- 2014-02-28 10:55 143 Edane d---- 2014-02-28 10:55 144 Brunsberg d---- 2014-02-28 10:55 148 Nyed d---- 2014-02-28 10:55 149 Hedenskog d---- 2014-02-28 10:55 150 Kroppa d---- 2014-02-28 10:55 151 Loka d---- 2014-02-28 10:55 152 Dalen d---- 2014-02-28 10:55 154 Karlanda d---- 2014-02-28 10:55 156 Glava d---- 2014-02-28 10:55 158 Boda d---- 2014-02-28 10:55 159 Frykerud d---- 2014-02-28 10:55 160 Frykestad d---- 2014-02-28 10:55 161 Forshaga d---- 2014-02-28 10:55 164 Storfors d---- 2014-02-28 10:55 167 Holmedal d---- 2014-02-28 10:55 169 Lenungen d---- 2014-02-28 10:55 172 Vermskog d---- 2014-02-28 10:55 173 Edsvalla d---- 2014-02-28 10:55 174 Grava d---- 2014-02-28 10:55 175 Alster d---- 2014-02-28 10:55 176 Glumserud d---- 2014-02-28 10:55 177 Kungskog d---- 2014-02-28 10:55 178 Lundsberg d---- 2014-02-28 10:55 180 Mona d---- 2014-02-28 10:55 181 Foxen d---- 2014-02-28 10:55 182 Silbodal d---- 2014-02-28 10:55 183 Sannaneknatten d---- 2014-02-28 10:55 186 Borgvik d---- 2014-02-28 10:55 187 Grums d---- 2014-02-28 10:55 188 Eriksberg d---- 2014-02-28 10:55 189 Karlstad d---- 2014-02-28 10:55 193 Alkvettern d---- 2014-02-28 10:55 194 Trankil d---- 2014-02-28 10:55 195 Blomskog d---- 2014-02-28 10:55 196 Sillerud d---- 2014-02-28 10:55 198 Gillberga d---- 2014-02-28 10:55 199 Segmon d---- 2014-02-28 10:55 200 Ed d---- 2014-02-28 10:55 204 Presterud d---- 2014-02-28 10:55 205 Kristinehamn d---- 2014-02-28 10:55 207 Salholmen d---- 2014-02-28 10:55 208 Gustavsfors d---- 2014-02-28 10:55 211 Kila d---- 2014-02-28 10:55 212 Hammar d---- 2014-02-28 10:55 215 Skallholmen d---- 2014-02-28 10:55 217 Posseberg d---- 2014-02-28 10:55 219 Degerfors d---- 2014-02-28 10:55 220 Torrskog d---- 2014-02-28 10:55 221 Suled d---- 2014-02-28 10:55 222 Svanskog d---- 2014-02-28 10:55 223 Tveta d---- 2014-02-28 10:55 224 Seffle d---- 2014-02-28 10:55 226 Kilsbyn d---- 2014-02-28 10:55 227 Visnum d---- 2014-02-28 10:55 228 Nysund d---- 2014-02-28 10:55 233 Rudskoga d---- 2014-02-28 10:55 234 Grytfors d---- 2014-02-28 10:55 237 Millesvik d---- 2014-02-28 10:55 240 Rosenborg 

Очевидно, что скрипт работает. Однако он создает только 116 папок из 245 папок, которые он должен создать. Это может быть связано с самим сценарием. Это пропускаемые строки, такие как 002 Långflonи 003 Källegrafsrösпотому, что они содержат буквы Å, Ä и / или Ö. Есть идеи? Но дело в том, что скрипт работает в окне консоли PS, как и ожидалось.

Выполнение одного и того же сценария PS с Å, Ä и Ö

Я намеренно добавил Ä в имя папки. Так testбыл переименован в täst. Я обновил файл скрипта этими изменениями, и теперь это мой скрипт.

$folder="C:\täst"; $txtFile="C:\täst\Export.txt";  get-content $txtFile | %{  if($_ -match "^(\d+) (\w+)$") { mkdir "$folder\$_"; } } 

В тестовой папке нет папок. Я удалил их, чтобы повторно запустить тест.

PS C:\täst> dir   Directory: C:\täst   Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2014-02-28 09:12 3648 Export.txt -a--- 2014-02-28 11:04 164 script.ps1   PS C:\täst> 

И снова, это я запускаю обновленный файл скрипта.

PS C:\täst> .\script.ps1 get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist. At C:\täst\script.ps1:4 char:1 + get-content $txtFile | %{ + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\täst\Export.txt:String) [Get-Content], ItemNotFoun + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand  PS C:\täst> 

Не удается найти путь 'C: \ täst \ Export.txt', поскольку он не существует.

Как видите, он пытается найти путь, которого там нет. Точка доказана. Персонажи Å, Ä и Ö ломают PS! Но почему? Что я делаю, что так неправильно? ...

3
Не используйте кавычки при вводе `. \ Script.ps1`. Это просто повторило бы вашу команду. Ashtray 10 лет назад 0
Так `. \ Script.ps1` запустит его? Но говорит `type". \ Script.ps1 "` и это значит включать кавычки, нет? Samir 10 лет назад 0
Ой! Так что это ** работает ** тогда. Спасибо! Просто ** он ** не работает с моим собственным путем поиска. У меня есть `\\ FILESERVER \ path \ path \ path`, смонтированный как диск` Z: `. Он включает в себя букву ** Ä **, и это достаточная причина, чтобы PS не работал? Кажется, эти письма совсем не нравятся. Приведенный выше сценарий даже не хочет создавать новые папки, если в имени заданы буквы Å, Ä и Ö. Samir 10 лет назад 1
Так что я не совсем уверен, что это отвечает на мой вопрос, это вроде ... вроде ... работает с `. \ Filename.ps1`, если путь не включает в себя такие символы, как ** Ä **. Samir 10 лет назад 0
Вы можете найти эту статью полезной: http://technet.microsoft.com/en-us/library/ee176949.aspx wmz 10 лет назад 0
@Sammy Причина, по которой скрипт не создает некоторые папки, заключается в том, что я создал оригинальный скрипт, чтобы он соответствовал только тем именам, которые вы сначала указали (т. Е. 3 цифры, пробел, а затем символы z). Смотрите обновленный ответ на ваш оригинальный вопрос для шаблона, который соответствует всем вашим именам. http://superuser.com/questions/722372/how-to-create-multiple-folders-and-name-them-by-reading-lines-from-text-file/722379#722379 Martin 10 лет назад 0
@ Martin Да, я могу подтвердить, что ваш скрипт теперь работает и на этом компьютере с Windows 8. Но я немного запутался здесь ... Я вчера проверил ваш оригинальный скрипт на моем компьютере с Vista, и он сработал. Хотя я не уверен, что он создал все папки, но создал много, поэтому я не считал. Какая разница, если это Windows Vista или Windows 8? ... Кроме того, это, по крайней мере, частично проблема кодирования или нет? Смотрите мои комментарии к ответу UnlimitedInfinity ниже. Samir 10 лет назад 0
@ Сэмми, проблема с европейскими символами решается с помощью кодирования вашего скрипта в ANSI. Вам нужно использовать другой «шаблон соответствия» для извлечения имен файлов из вашего ввода, как в ответе Мартина (в другом посте). UnlimitedInfinity 10 лет назад 0
Новый скрипт Мартина работает. Однако он работает из `C: \ test` и из` Z: \ test`, но не из `Z: \ S_Värmland \ test`. C - это мой локальный диск, а Z - это сетевое расположение (`\\ FILESERVER`), смонтированное как Z-диск. Так что, похоже, я прав насчет вопроса о пути поиска, ему не нравятся ** Ä ** в пути поиска? Samir 10 лет назад 0
@ Самми, запусти `type theNewScriptName`. Вы видите умлаута или двух "странных" персонажей? Другими словами, вы уверены, что сохранили скрипт в ANSI? UnlimitedInfinity 10 лет назад 0

3 ответа на вопрос

3
UnlimitedInfinity

Здесь вам, кажется, удалось ввести имя каталога, используя UTF-8 (набор символов):

$folder="C:\täst"; 

Умлаут хранится в скрипте в виде двух символов. Вот почему вы видите это как два символа в сообщении об ошибке:

get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist. 

Как именно вы «намеренно добавили Ä в имя папки»? Вы должны сделать это как ASCII, а не как UTF-8.

Отобразите ваш скрипт с помощью команды "type"; Я уверен, что вы увидите представление UTF, как в сообщении об ошибке. Ваш редактор отображает умлаут для вас, как вы ожидаете. Команда type [скорее всего] покажет умлаут в виде двух символов, как в сообщении об ошибке.

Убедитесь, что ваш редактор сохраняет чистый ASCII или ANSI.

Моим «редактором» был Windows Explorer. Если это поможет? Я просто переименовал папку из «test» в «täst» в Проводнике. Что касается сценария, он был сохранен с Notepad ++ с UTF без спецификации. Samir 10 лет назад 0
@Sammy Используйте ANSI, а не UTF. В значительной степени ** никогда ** не сохраняйте скрипт в UTF. UTF для ваших данных, ANSI для ваших скриптов. UnlimitedInfinity 10 лет назад 0
Как вы гарантируете, что «чистый ASCII» используется в Notepad ++? Я могу получить только ANSI, и, насколько я понимаю, это фактически версия ASCII для Microsoft. Но я могу ошибаться. Samir 10 лет назад 0
@Sammy ANSI и ASCII достаточно похожи, поэтому я всегда считал их одинаковыми. Я только что спросил Google, и есть некоторые различия: http://www.differencebetween.net/technology/web-applications/difference-between-ansi-and-ascii/ Ответ теперь имеет оба. UnlimitedInfinity 10 лет назад 0
@Sammy Чтобы сохранить как ANSI в Notepad ++, щелкните меню «Кодировка» -> «Кодировать в ANSI». Martin 10 лет назад 1
Это было полезно до такой степени, что у меня теперь есть сценарий PS, создающий 237 папок из общего числа 245. Некоторые из них все еще пропускаются. Не знаю почему. Но наличие списка в UTF-8 (с BOM) и сценария в ANSI (ASCII) помогло. Samir 10 лет назад 0
Полный список предметов в списке можно найти по адресу http://pastebin.com/SNde4bBN. Samir 10 лет назад 0
Элементы, которые пропускаются из списка, это элементы с дополнительным пробелом, такие как `021 Södra Finnskoga`, в отличие от` 020 Rya`, который имеет только один пробел сразу после цифр. Samir 10 лет назад 0
Это связано с моделью совпадения. Новый шаблон соответствия здесь: http://superuser.com/questions/722372/how-to-create-multiple-folders-and-name-them-by-reading-lines-from-text-file/722379#722379 UnlimitedInfinity 10 лет назад 0
1
and31415

Запуск скрипта PowerShell

Предположим, у вас есть скрипт PowerShell, который my script.ps1хранится в C:\Some folder. Чтобы запустить его, вы можете:

  • Перейдите к фактическому пути и затем выполните его:

    cd "C:\Some folder" & ".\my script.ps1" 
  • Выполните его, указав полный путь напрямую:

    & "C:\Some folder\my script.ps1" 

&является оператором вызова . В качестве альтернативы вы можете запустить его из обычной командной строки:

powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File "C:\Some folder\my script.ps1" 

Исправление скрипта

Я переписал скрипт так, чтобы он принимал два аргумента: входной файл (предполагается, что это текст, сохраненный как UTF-8) и папка назначения. Если кодировка не указана, по умолчанию используется ASCII.

if ($args.Count -gt 1) { $file=$args[0]; $dest=$args[1]; Get-Content $file -Encoding UTF8 | %{ md "$dest\$_" >$null; } } 

Рекомендации

Эй, это действительно удобно. Не знал об этом синтаксисе. Спасибо! Ashtray 10 лет назад 0
Да, я сейчас проверил, `" .script.ps1`alone не работает. Но `&". \ Script.ps1 "` работает, как и `. \ Script.ps1`. Но это, однако, делает не помогите мне с проблемами, которые возникают у меня с символами Å, Ä и Ö. Почему PS не понимает эти символы? Я скоро опубликую обновление своего вопроса с примерами. Samir 10 лет назад 0
Я обновил свой вопрос с примерами. Если вы можете расширить свой ответ и объяснить, как запускать сценарий в PS, когда в пути поиска есть символы, не входящие в ASCII, я мог бы принять это как решение. Или это на самом деле связано с самим сценарием (`get-content $ txtFile`)? Samir 10 лет назад 0
Вы имеете в виду как `get-content $ txtFile | % {} `? Это только выводит `mkdir" $ folder \ $ _ ";` многократно 245 раз в окне PS, это не создает никаких папок. Samir 10 лет назад 0
Я заметил, что оригинальный сценарий не будет работать должным образом с такими вещами, как 021 Södra Finnskoga, потому что в названии есть пробел. В любом случае, имея скрипт типа `$ folder =" C: \ täst "; $ TxtFile = "C: \ Tast \ Export.txt"; get-content $ txtFile | % `у меня работает. Что вы используете для сохранения / редактирования скрипта и списка? Это похоже на проблему кодирования. and31415 10 лет назад 0
Да. Это похоже на проблему с кодировкой. Пожалуйста, посмотрите мой ответ. UnlimitedInfinity 10 лет назад 0
@ Сэмми Я обновил свой ответ, чтобы предоставить дополнительную информацию. Дайте мне знать, если у вас есть дальнейшие сомнения. and31415 10 лет назад 0
-1
Infinum

Вы должны сохранить файл как UTF-8 с BOM - вы можете использовать Notepad ++. Powershell не работает и не может надежно читать файлы UTF-8 без спецификации.

Та же проблема + решение, как описано выше: https://stackoverflow.com/a/14482588/1819480