【发布时间】:2013-07-11 01:51:43
【问题描述】:
更新:在底部添加了另一个事实。
我要疯了,试图理解为什么这个简单/明显/必要的功能不起作用(对我来说)。我找不到任何有同样问题的人,所以就像我改变了一些系统默认值(坏习惯)并搞砸了自己,现在发现自己处于“只是甜点”的接收端,但仍然.. .
问题陈述:
鉴于已找到且可执行的工作 powershell 脚本...为什么在将这些脚本移至 psdrive 时找不到这些脚本 并且通过 $env:path 隐式调用(其中包括引用 psdrive 的脚本文件夹)? (为清楚起见,此段已编辑)
测试用例:
1) 运行以下命令创建本地磁盘 psdrive:
new-psdrive -name home -psprovider filesystem -root $HOME
2) 将(工作的)豪华脚本(称为“script.ps1”)复制到 $HOME
3) $env:path += ";home:"
4) 将目录更改为 $HOME 以外的任何位置。
5) 从打开的豪华命令窗口运行:“script”或“script.ps1”
我认为脚本应该通过引用 $env:path 中的“home:/”组件来找到。
找不到脚本。
只是为了微笑(并消除内容作为问题),让 $HOME/script.ps1 的内容成为字符串:
"hello world"
当我跑步时
home:/script
或
&"$HOME/script"
或(从 $HOME/Documents 调用)
../script
脚本打印...
hello world
Quelle 惊喜,嗯?但是当我跑步时
script
或
script.ps1
我收到熟悉的错误消息:
The term 'script' is not recognized as the name of a cmdlet, ...
然而家:在路上:
$ $env:path -split ";"
%SystemRoot%\system32\WindowsPowerShell\v1.0\
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
c:\Program Files\Sysinternals
C:\Program Files\Vim\vim73\
C:{my home directory}/psbin
home:/
如果我将 script.ps1 移动到 $HOME/psbin(也在 $env:path 中,但是一个普通文件夹,而不是 psdrive)并再次运行脚本,我得到:
$ script
hello world
总结:
找不到豪华脚本
1) 脚本位于 psdrive 文件夹中
2) psdrive 文件夹在 $env:path 中
3) 相对于 $env:path 中的 psdrive 文件夹组件(隐式)调用脚本,而不是使用绝对或相对路径。
请注意,在上面的测试用例中,脚本位于本地 C: 驱动器上的 psdrive 上。
请进一步注意,“正在寻找”/“未找到”不是脚本本身的功能;它是脚本位置(特别是:psdrive / 不是 psdrive)以及调用是否依赖于 $env:path 的函数。
请进一步注意,如果我使用绝对或相对于当前目录的路径调用它,脚本就会运行(再次表明这不是 acl/attr/gpo 问题。)
为什么在 $env:path 中找不到脚本???
背景资料:
1) 我在作为 VMware Workstation 8.0.6 来宾、Win7HomePremium 同上运行的 Win7Pro 和裸机 WHS2011 服务器(通过 rdp 连接)中看到了这种行为;
2) 我在 32b Win7Pro (VM)、64b Win7HomePremium (VM) 和 64b WHS2011 (rdp) 上看到了这种行为;
3) 当前用户和机器的执行策略设置为“绕过”(在其他范围内未定义)。
4) PowerShell 2.0 版
5) pathext 由 .ps1 扩充:
$ $env:pathext
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.ps1
6) Win7 / WHS2011 系统全面修补
我做错了什么?
FWIW,我使用 psdrives,因为我有 非常 长路径(带有嵌入的空格...感谢 VMware!)到主机上的文件。我不使用符号链接,因为 posh 带有符号链接复活节彩蛋:
小时/吨:
http://blog.rlucas.net/rants/dont-bother-with-symlinks-in-windows-7/
如果任何 posh+symlink 用户阅读此内容,rm -rf symlink-to-$HOME-folder 删除在理论上是没有问题的:我以这种方式删除了我的大部分 linux 主目录(通过符号链接到VMware 托管共享文件夹,如果这一点不清楚。)
更新:
如果我将长路径(在我感兴趣的情况下,convert-path 返回的 UNC 路径)添加到 $env:path 而不是 psdrive-relative 路径,那么 posh 会找到脚本。
这(再次)表明问题不是网络驱动器的 acl/gpo/attr 问题(这是我的脚本所在的位置)。
在代码中,如果我将 $env:path 变量设置为:
$env:path += ";//vmware-host/Shared Folders/blah/psbin"
而不是
$env:path += ";blah:/psbin"
其中 blah:是植根于 //vmware-host/Shared Folders/blah 的 psdrive。
不是激进或任何东西,但似乎 powershell 无法解析 $env:path 变量中的 psdrives。
谁能解释为什么会这样?我认为语言应该关闭它们自己的语义。
还是我忽略了一些基本/明显的观点?
【问题讨论】:
标签: powershell path execution