Подтвердить что ты не робот

Вызов командлетов powershell из командного файла Windows

Хорошо, что просто так просто не работает для меня. У меня есть командлет, который принимает один параметр. Я пытаюсь вызвать командлет в пакетном файле 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!

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

Спасибо

4b9b3361

Ответ 1

Начиная с версии Powershell версии 2, вы можете запустить Powershell script, как это...

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

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

Ответ 2

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

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

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

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

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 script, хотя я рекомендую размещать командный файл и файл PowerShell script в том же каталоге, как описано в моем блоге.

Ответ 3

Проблема заключается в файле 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

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

param($path)
$tempfile = "C:\temp.txt"
set-ExecutionPolicy Unrestricted
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode
set-ExecutionPolicy Restricted

Ответ 4

# 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'}"

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

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 или удачи.

Ответ 5

Я получил эту работу... Файл 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

Ответ 6

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

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