Вызов командлетов powershell из командного файла Windows - PullRequest
20 голосов
/ 31 мая 2009

Хорошо, что-то такое простое, просто не работает для меня. Я получил командлет, который принимает один параметр. Я пытаюсь вызвать командлет в командном файле Windows. Пакетный файл содержит:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0
powershell Set-ExecutionPolicy Unrestricted
powershell 'C:\convert-utf8-to-utf16.ps1 C:\test.txt'
powershell Set-ExecutionPolicy Restricted
pause

Мой файл ps1 снова не делает ничего особенного:

function convert-utf8-to-utf16 {   
  $tempfile = "C:\temp.txt"
  set-ExecutionPolicy Unrestricted
  get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode
  set-ExecutionPolicy Restricted
}

Когда я выполняю файл bat, он просто запускается до конца (без сообщений об ошибках) и не создается файл temp.txt.

Я могу запустить командный файл powershell в командной строке PS, но не в cmd!

У кого-нибудь есть идеи, что может быть не так?

Ответы [ 6 ]

22 голосов
/ 27 мая 2010

Начиная с версии 2 Powershell, вы можете запускать скрипт Powershell следующим образом ...

powershell -ExecutionPolicy RemoteSigned -File "C:\Path\Script.ps1" "Parameter with spaces" Parameter2

Теперь, если бы я только мог найти способ обработки перетаскивания файлов в сценарий Powershell .

8 голосов
/ 26 ноября 2013

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

Это в основном то, что вы ищете:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\convert-utf8-to-utf16.ps1' 'C:\test.txt'"

И если вам нужно запустить скрипт PowerShell от имени администратора, используйте это:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\convert-utf8-to-utf16.ps1"" ""C:\test.txt""' -Verb RunAs}"

Вместо того, чтобы жестко задавать полный путь к сценарию PowerShell, я рекомендую поместить пакетный файл и файл сценария PowerShell в один каталог, как описано в моем сообщении в блоге.

5 голосов
/ 14 августа 2009

Проблема в файле ps1 - вы объявляете функцию, но не вызываете ее. Я бы изменил это так:

param($path)
function convert-utf8-to-utf16 {   
 $tempfile = "C:\temp.txt"
 set-ExecutionPolicy Unrestricted
 get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding Unicode
 set-ExecutionPolicy Restricted
}

convert-utf8-to-utf16 $path

это будет работать. Однако это не нужно, вы можете просто опустить объявление функции и переместить тело в сам скрипт:

param($path)
$tempfile = "C:\temp.txt"
set-ExecutionPolicy Unrestricted
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode
set-ExecutionPolicy Restricted
3 голосов
/ 15 августа 2009
# Test-Args.ps1
param($first, $second)
write-host $first
write-host $second

Вызов из командной строки:

PowerShell.exe -NoProfile -Command "& {./Test-Args.ps1 'C:\Folder A\One' 'C:\Folder B\Two'}"

Что сбивает с толку, так это то, что если скрипт находится в пути к папке, содержащей пробелы, PowerShell не распознает имя скрипта в кавычках:

PowerShell.exe -NoProfile -Command "& {'C:\Folder X\Test-Args.ps1' 'C:\Folder
 A\One' 'C:\Folder B\Two'}"

Но вы можете обойти это, используя что-то вроде:

PowerShell.exe -NoProfile -Command "& {set-location 'C:\Folder X';./Test-Args.ps1 'C:\Folder
 A\One' 'C:\Folder B\Two'}"

Не используйте пробелы в имени файла .PS1, или вам не повезло.

1 голос
/ 01 июня 2009

У меня все получилось ... Файл ps1 не нужно переносить в функцию. Просто эта декларация в порядке.

$tempfile = "C:\temp.txt"  
get-content -Path $args[0] -encoding utf8 | out-file $tempfile -encoding unicode      

и файл bat называет его так:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0
powershell Set-ExecutionPolicy Unrestricted
powershell "& 'C:\convert-utf8-to-utf16.ps1 C:\test.txt' 'C:\test.txt'"
powershell Set-ExecutionPolicy Restricted
pause
0 голосов
/ 31 мая 2009

Попробуйте этот синтаксис вместо:

cd %SystemRoot%\system32\WindowsPowerShell\v1.0
powershell {Set-ExecutionPolicy Unrestricted}
powershell "& C:\convert-utf8-to-utf16.ps1 C:\test.txt"
powershell {Set-ExecutionPolicy Restricted}
pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...