by mikekmcguire at 2013-01-24 16:21:56
Hello,by nohandle at 2013-01-25 05:21:00
I’m unable to pass command-line values to a dot-sourced param block.
Using PowerShell v2, I have a series of scripts that require an extensive number of command-line parameters. To keep future maintenance down, I thought I’d be tricky and set these up as a separate .ps1 file, then dot-source this in at the start of each script.
I think I was too tricky for my own good. My naive assumption was that the contents of the dot-sourced file are essentially pasted in at the point of dot-sourcing, then the newly expanded source file re-parsed from the beginning, making the “Param(” of the dot-sourced file the “new” beginning of the file.
The parameters seem to be working. I have a mandatory one, and when I run the ps1 file that dot-sources the “parameter file”, I get prompted to enter the missing parameter. The command-line values don’t seem to be making it through, however.
I have tried passing in $args like this
. .\config_loader.ps1 $args
but get the following error:
C:\tfs\AlertSpace\dev\dec\Src\config_loader.ps1 : Cannot process argument transformation on parameter ‘bcpPath’. Cannot convert value to type System.String.
At C:\tfs\AlertSpace\dev\dec\Src\mike1.ps1:1 char:2
+ . <<<< .\config_loader.ps1 $args
+ CategoryInfo : InvalidData: ( [config_loader.ps1], ParameterBindin…mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,config_load
"bcpPath" is the name of my first parameter, defined as
[string] $bcpPath = “bcp.exe”,
Any idea if what I want to do is possible (perhaps in a different manner), or how I screwed up the process?
[edited for clarity]
Modules?by mikekmcguire at 2013-01-30 20:44:47
Topic: On my station the .sourced script accepts parameters normally:
$dotSourced: $dotSourced"</code><br><br>Main: <br><code>. c:\temp\dotSourced.ps1 <br><br>"$args: $args"
The error you get is because the content of $args cannot be converted to String.
Thanks for the information – and sorry it took so long to reply.
I finally restructured the program. Now, I have an introductory script (load.ps1) that has the parameters set up in it. After they are all set, I dot-source the actual PowerShell file that does the work. The name of that file is passed in as a parameter to load.ps1. It’s not an elegant solution, by any means, but it works!