none
dateの正体を知りたい

    質問

  • マイクロソフトコミュニティで質問したところ、こちらに誘導されました。

    https://answers.microsoft.com/ja-jp/windows/forum/windows_other-windows_programs/powershell/e6657b25-9fea-4194-83bb-8e7d69dcca51

    powershellのスクリプトやコマンドラインでなにげなくdateコマンド?を使っていました。get-dateコマンドレットと全く同じ機能です。あるとき、このdateが認識されず、困ったのですが、アクセスできる環境で試してみると

    • windows7/powershell 2.0
    • windows10 anniversary update適用/PS5.1

    ではdateが機能するのですが、

    • windows10 creators update適用/PS5.1

    だと、認識されず、exeコマンドのdateを呼び出しにいってwin32モードでの実行に失敗するという結果でした。

    そこでそもそもdateとは何者だろうと調べたところ、リンク先にも記したようにコマンドレットでも関数でもエイリアスでも外部コマンドでもなさそうです。認識しないcreators update版では当然ですが、普通に使えるwin7版などでも、get-commandの出力にdateはありません。

    質問ですが、

    1. dateが使えないのはcreators update以降という認識でいいのか
    2. そもそもこのdateは何者なのか

    の2点です。ご存じの方は回答をお願いします。

    2017年8月1日 18:28

回答

  • 手元のCreators Updateでは使えていますので、何らかの問題が発生していると思われます。

    PS C:\> $PSVersionTable.PSVersion
    
    Major  Minor  Build  Revision
    -----  -----  -----  --------
    5      1      15063  483
    
    
    PS C:\> date
    
    2017年8月2日 8:07:05

    ちなみに私も知らなかったのですが、dateを実行するとGet-Dateが実行されるように、コマンドが見つからなかった場合に Get- が付与されて実行し直されているようです。例えばrandomもGet-Randomが呼ばれますし、itemもGet-Itemが呼ばれます。

    この機能の名称もわかりませんでしたし、公式ドキュメントを見つけることもできませんでしたので、この辺りの説明は詳しい方に任せたいと思います。

    • 回答としてマーク ballville 2017年8月2日 6:35
    2017年8月1日 23:14
  • こんにちは。

    通常Windows(Windows10 creators updateも含めて)には、date.exeというものは存在しません。

    何らかの理由で混入したものと思われますので、コマンドプロンプトかPowerShellコンソール上で、

    where.exe date

    と打てば、date.exeがどこにあるかわかります。

    で、その結果によってどうすべきか判断できると思います。

    ちなみに、PowerShellのdateコマンドについては、先に佐祐理さんが回答されていますが、Get-DateのGet-が省略された形となっています。

    こちらの挙動については牟田口さんのブログに詳細が載っています。

    本当は怖いPowerShell その2 コマンド名の"Get-"補完

    この挙動については言語仕様書などには載っておらずとくに名前も無い様です。

    • 回答としてマーク ballville 2017年8月2日 6:36
    2017年8月2日 3:30

すべての返信

  • 手元のCreators Updateでは使えていますので、何らかの問題が発生していると思われます。

    PS C:\> $PSVersionTable.PSVersion
    
    Major  Minor  Build  Revision
    -----  -----  -----  --------
    5      1      15063  483
    
    
    PS C:\> date
    
    2017年8月2日 8:07:05

    ちなみに私も知らなかったのですが、dateを実行するとGet-Dateが実行されるように、コマンドが見つからなかった場合に Get- が付与されて実行し直されているようです。例えばrandomもGet-Randomが呼ばれますし、itemもGet-Itemが呼ばれます。

    この機能の名称もわかりませんでしたし、公式ドキュメントを見つけることもできませんでしたので、この辺りの説明は詳しい方に任せたいと思います。

    • 回答としてマーク ballville 2017年8月2日 6:35
    2017年8月1日 23:14
  • こんにちは。

    通常Windows(Windows10 creators updateも含めて)には、date.exeというものは存在しません。

    何らかの理由で混入したものと思われますので、コマンドプロンプトかPowerShellコンソール上で、

    where.exe date

    と打てば、date.exeがどこにあるかわかります。

    で、その結果によってどうすべきか判断できると思います。

    ちなみに、PowerShellのdateコマンドについては、先に佐祐理さんが回答されていますが、Get-DateのGet-が省略された形となっています。

    こちらの挙動については牟田口さんのブログに詳細が載っています。

    本当は怖いPowerShell その2 コマンド名の"Get-"補完

    この挙動については言語仕様書などには載っておらずとくに名前も無い様です。

    • 回答としてマーク ballville 2017年8月2日 6:36
    2017年8月2日 3:30
  • 情報ありがとうございます。$PSVERSIONTABLEの出力がまったく同一でしたので、助かりました。

    get-の付加というのは盲点でした。

    当該端末はwindows7からのアップデートで、Win7時代、SUA(Subsystem for Unix Application)がインストールされていました。date.exeがその一部としてC\Windows\SUA\commonに置かれパスも切られたままになっていたため、このdateを実行しようとしてエラーになっていました。

    >コマンドが見つからなかった場合に Get- が付与されて実行し直されているようです

    は正解だと思います。get-付加ルールが発動するのはパスのとった場所にある実行ファイルを探してみてなかったときだけということになるのでしょうね。

    2017年8月2日 15:56
  • 情報ありがとうございます。get-の付加というのは盲点でした。

    お示しくださったリンク先を興味深く拝見しました。OSアップデートに伴いゾンビのように残っていたdate.exeが邪魔してたのは確かに「本当は怖い」ことですね。
    2017年8月2日 16:00