Вызов командлетов 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!
У кого-нибудь есть идеи, что может быть неправильным?
Спасибо
Ответы
Ответ 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