我试图通过设置函数和别名来运行它们来简化我执行的某些脚本的执行方式。我目前具有将目录更改为需要运行脚本的位置的功能,但是当我尝试运行脚本本身时,出现以下错误:
CATX
函数是:
C:\Users\me\Desktop\BoB : The term 'C:\Users\me\Desktop\BoB' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
again.
At line:1 char:1
+ C:\Users\me\Desktop\BoB Tools\folderScannerV0.4.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\jteit\Desktop\BoB:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
我已经根据发现的其他答案尝试了一些变体,但是我仍然遇到相同的错误。我希望不要删除路径上的空间,因为其他脚本可以成功使用它。从ISE运行脚本不会给我带来任何问题。
理想情况下,我希望该功能还允许我在不希望更改工作目录的情况下使脚本在所需的文件夹上运行(每个脚本在静态位置的一组特定文件上都有效,但是其中一些使用$ PWD以获取该位置的文件夹)。
例如,在我的$ profile文件中,我具有以下功能:function run-scanner { "& 'C:\Users\me\Desktop\BoB Tools\folderScannerV0.4.ps1'" | Invoke-Expression }
在执行上述脚本之前运行。我希望它们在不更改我的工作目录的情况下滚动成一个命令(这会使function go-to-temp {cd "C:\Users\me\Desktop\Bob Tools\To be Formatted\Temp"}
函数变得多余。
我在做什么错?
答案 0 :(得分:4)
There is no reason to run your script through Invoke-Expression
。
除非您的脚本依赖于$PWD
,否则您应该能够使用调用运算符&
来执行它。如其他海报所述,如果需要脚本生成的变量,可以使用点源(.
),但这会将所有全局对象(别名,变量,函数)导入当前作用域< / strong>。如果确实依靠$PWD
,则可以将Start-Process
与-WorkingDirectory
结合使用,以避免更改您的位置。
function Start-Scanner {
& "$HOME\Desktop\BoB Tools\folderScannerV0.4.ps1"
}
或
function Start-Scanner {
$startArgs = @{
FilePath = "$PSHOME\powershell.exe"
ArgumentList = '-File', "`"$HOME\Desktop\BoB Tools\folderScannerV0.4.ps1`""
WorkingDirectory = "$HOME\Desktop\BoB Tools"
NoNewWindow = $true
Wait = $true
}
Start-Process @startArgs
}
答案 1 :(得分:2)
您可以仅使用dot-sourcing:
function run-scanner { . 'C:\Users\me\Desktop\BoB Tools\folderScannerV0.4.ps1' }