1

更新: 下部に別のファクトイドを追加しました。


このシンプルで明白な/必要な機能が機能しない理由を理解しようとしています(私にとって)。同じ問題を抱えている人を見つけることができなかったので、システムのデフォルト(悪い習慣)を変更して自分を台無しにして、「ただのデザート」の受信側にいることに気づきましたが、それでも.. .

問題文:

動作している実行可能な PowerShell スクリプトが見つかって実行可能である場合、これらのスクリプトが psdrive に移動され、$env:path (psdrive を参照するスクリプト フォルダーを含む) を介して暗黙的に呼び出されたときに、これらのスクリプトが見つからないのはなぜですか? (このパラグラフは明確にするために編集されています)

テストケース:

1) 次を実行して、ローカル ディスクの psdrive を作成します。

new-psdrive -name home -psprovider filesystem -root $HOME

2) (作業中の) posh スクリプト (「script.ps1」と呼ぶ) を $HOME にコピーします。

3) $env:path += ";home:"

4) ディレクトリを $HOME 以外の場所に変更します。

5) 開いている posh コマンド ウィンドウから、「script」または「script.ps1」を実行します。

$env:path の「home:/」コンポーネントを参照して、スクリプトを見つける必要があることを提出します。

スクリプトが見つかりません。

にやにや笑いのために (そしてコンテンツを問題から除外するために)、 $HOME/script.ps1 のコンテンツを次の文字列にします。

"hello world"

私が走るとき

home:/script

また

&"$HOME/script"

または ($HOME/Documents から呼び出す)

../script

スクリプトが出力します...

hello world

驚きですね。しかし、私が走るとき

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

要約:

posh スクリプトが見つからない場合

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 ゲストとして実行されている Win7Pro、Win7HomePremium 同上、およびベアメタル WHS2011 サーバー (rdp 経由で接続) で見られます。

2) この動作は、32b Win7Pro (VM)、64b Win7HomePremium (VM)、および 64b WHS2011 (rdp) で見られます。

3) 実行ポリシーは、現在のユーザーとマシンに対して「バイパス」に設定されています (他のスコープでは未定義です)。

4) パワーシェル バージョン 2.0

5) pathext は .ps1 によって拡張されます。

$ $env:pathext
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.ps1

6) 完全にパッチが適用された Win7 / WHS2011 システム


私は何を間違っていますか?

FWIW、ホストマシン上のファイルへのパスが非常に長いため(スペースが埋め込まれています...ありがとう、VMware! )、 psdrivesを使用します。poshにはシンボリックリンクのイースターエッグが付属しているため、シンボリックリンクは使用しません。

https://connect.microsoft.com/PowerShell/feedback/details/727149/powershell-rm-rec-traverses-symbolic-links-and-removes-items-in-target

時間:

http://blog.rlucas.net/rants/dont-bother-with-symlinks-in-windows-7/

posh + symlink ユーザーがこれを読んだ場合、 rm -rf symlink-to-$HOME-folder の削除は理論的な懸念事項ではありません。Linux ホーム ディレクトリの大部分をこの方法で削除するというキーストロークの範囲内になりました (VMware ホスト共有へのシンボリック リンク経由)。フォルダー、要点が不明確な場合)。

アップデート:

psdrive 相対パスではなく $env:path に長いパス (興味がある場合は、convert-path が返す UNC パス) を追加すると、posh はスクリプトを見つけます。

これは(再び)問題がネットワークドライブ(私のスクリプトがある場所)のacl/gpo/attrの問題ではないことを示しています。

コードでは、 $env:path 変数を次のように設定すると、powershell がスクリプトへのパスを解決します。

$env:path += ";//vmware-host/Shared Folders/blah/psbin"

それよりも

$env:path += ";blah:/psbin"

blah: は、//vmware-host/Shared Folders/blah をルートとする psdrive です。

急進的ではありませんが、powershell は $env:path 変数の psdrive を解決できないようです。

なぜこれがそうであるべきかを誰かが説明できますか?私は、言語は独自のセマンティクスに関して閉じている必要があると考えました。

それとも、基本的/明白な点を見落としていますか?

4

1 に答える 1