从Windows批处理文件调用powershell cmdlet

时间:2009-05-31 15:46:15

标签: powershell batch-file

好的事情很简单就是不适合我。我有一个接受单个参数的cmdlet。我试图在Windows批处理文件中调用cmdlet。批处理文件包含:

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文件。

我可以在PS命令提示符下运行powershell命令文件,但不能在cmd!

中运行

任何人都有任何想法可能出错?

6 个答案:

答案 0 :(得分:22)

从Powershell版本2开始,您可以像这样运行Powershell脚本......

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

现在,如果我只想办法处理dragging and dropping files to a Powershell script

答案 1 :(得分:8)

我解释了为什么要从批处理文件调用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脚本文件放在同一目录中,正如我的博客文章所描述的那样。

答案 2 :(得分: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

它会起作用。但是,它不是必需的,您可以简单地省略函数声明并将正文移动到脚本本身:

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

答案 3 :(得分: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文件名中使用空格,否则你的运气不好。

答案 4 :(得分:1)

我有这个工作...... 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

答案 5 :(得分: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