3

Когда я щелкаю правой кнопкой мыши файл 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 ответа3

3

Здесь вам, кажется, удалось ввести имя каталога, используя 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.

1

Запуск скрипта 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; }
}

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

-1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .