tags:

views:

4234

answers:

5

Ok something so simple is just not working for me. I got a cmdlet that accepts a single parameter. I am trying to call a cmdlet within a Windows batch file. The batch file contains:

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

My ps1 file again not doing anything special:

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
  }

When i execute the bat file it just runs to completion (no error messages) and it does not appear to create the temp.txt file.

I can run the powershell command file at the PS command prompt but not in cmd!

Anyone got any ideas what could be wrong?

Thanks

A: 

Try this syntax instead:

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
x0n
+1  A: 

I got this working...The ps1 file does not need to be wrapped into a function. Just this declaration is ok.

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

and the bat file calls it like:

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
What you ran into is that the script was definining a function, but not executing it. You could either call the function at the end of the script, or not wrap your code in a function at all (like you ended up doing).
JasonMArcher
+3  A: 

The problem is in the ps1 file - you declare a function but you don't call it. I would modify it like this:

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

it will work. However, it is not needed, you can simply ommit the function declaration and move the body into the script itself:

param($path)
$tempfile = "C:\temp.txt"
set-ExecutionPolicy Unrestricted
get-content -Path $path -encoding utf8 | out-file $tempfile -encoding Unicode
set-ExecutionPolicy Restricted
stej
A: 
# Test-Args.ps1
param($first, $second)
write-host $first
write-host $second

Call from Command Prompt:

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

What's confusing is that if the script is in a folder path containing spaces, PowerShell doesn't recognize the script name in quotes:

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

But you can get around that using something like:

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

Don't use spaces in your .PS1 file name, or you're outta luck.

Gordon Bell
A: 

Starting with Powershell version 2, you can run a Powershell script like so...

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

Now if I could only figure out a way to handle dragging and dropping files to a Powershell script.

Nathan Hartley