2015-06-03 4 views
2

Я столкнулся с проблемой, которую я не смог решить так, как хотел.Выполнение любого файла как сценария powershell

У меня есть файл, содержащий скрипт powershell, но этот файл не имеет расширения, назначенного powershell. Вопрос следующий: Как я могу выполнить powershell в файле сценария с неправильным расширением файла (или none)?

Invoke-Expression не работает, потому что он всегда выполняет действие по умолчанию, назначенное типу файла. Если я передам этот командлет *.txt, редактор откроется.

Я знаю, что могу решить это, переименовав файл сценария или, собственно говоря, его имя. Это то, что я закончил делать.

По-прежнему интересно, возможно ли выполнить файл как скрипт с неправильным расширением файла без изменения, переименования или копирования файла. И если он не работает ... почему?

ответ

4

Powershell сконструирован таким образом, что для выполнения или для точечного поиска файла требуется расширение .ps1, а Powershell.exe откажется запускать любой файл, который не имеет этого расширения.

Одним из способов вызова кода Powershell из файла, отличного от ps1, является запуск Powershell.exe с использованием STDIN и подключение к нему сценария. Для этого требуется новая оболочка, поэтому это не очень хорошо для запуска скриптов из существующей среды сценариев.

Powershell.exe - < thescript.txt 

Другой способ создать временный .ps1 файл и выполнить это. Это имеет преимущество использования текущей среды сценариев, но требует временного файла.

Copy-Item -Path '.\thescript.txt' -Dest '.\temp.ps1' 
. .\temp.ps1 
del .\temp.ps1 

На мой взгляд, ограничение на расширение файла глупо, но так оно и было разработано. Апокрифично, это из соображений безопасности, но я не могу найти цитаты, чтобы поддержать это.

+1

В качестве альтернативы вы также можете просто добавить расширение '.ps1' к имени файла:' Get-Item '. \ Thescript.txt' | Rename-Item -NewName {$ _. Name + '.ps1'} '. Его можно переименовать, используя свойство «BaseName». –

1

Или вы используете Get-Content, чтобы прочитать файл, а затем вызвать его с помощью Invoke-Expression или Invoke-Command -ScriptBlock.