2009-05-31 3 views
19

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

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

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

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

Благодаря

+0

Johannes: cmd.exe - это приложение Win32 (хотя многие люди все еще считают его DOS command.com). [Вопрос должен быть отредактирован) – grawity

+0

любое окончательное решение с полным исходным кодом об этом? – Kiquenet

ответ

0

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

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 
1

Я получил эту работу ... The ps1 файл не должен быть обернут в функцию. Просто эта декларация в порядке.

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

и файл летучая называет это нравится:

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

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

5

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

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

param($path) 
$tempfile = "C:\temp.txt" 
set-ExecutionPolicy Unrestricted 
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode 
set-ExecutionPolicy Restricted 
3
# 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 файла, или вы сбился удачи.

22

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

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

Теперь, если бы я только мог придумать способ справиться с dragging and dropping files to a Powershell script.

+0

Большое вам спасибо, это решило мою головную боль и избегало конвертировать powershell в NSIS – CharlesB

7

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

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

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 в том же каталоге, как описано в моем сообщении в блоге.

Смежные вопросы