WindowsでのBash:ハリネズミとヘビの交差に関する実地実験

Windows 10 Creators Updateの到着したアップデートでは、このLinuxでWindowsプログラムを実行するという興味深い機会がありました。 公式の例は私には不向きでした。Microsoftのエバンジェリストは、PowerShellで牛描き、bashからメモ帳を実行することを提案しました。 なに? あなたが考えたのはそれだけですか?



画像



WSL内でexeファイルを実行する機能を熱心に待っていた人として、新しい機能を正しく使用した経験を共有したいと思います。



WindowsでBashを使用して、あらゆる小さな機械化(収縮、解析、分析)を行います。 10〜20ギグのログを取り、そのようなものを探してそれらを想起させます。 200ギガバイトのソースデータを取得し、VZHUHとpulnutをサイトデータベースで数メガの結果にします。 一般的に、他の皆のように、通常の日常生活。 そうじゃない?



だから私の経験



ケース番号1



これはまさに、WSLでexeファイルを実行する機能を待っていたものです。



さまざまなプログラムのウェブサイトが多数あります。すべてのダウンロードリンクが最新バージョンにつながっていることを確認する必要があります。



画像



リンクの検索とファイルのダウンロードの段階をスキップして、必要な情報を抽出します。

これには2つの方法があります。



最初の方法-WMICへのアピール



CMDでは、この情報の呼び出しは次のようになります。



wmic datafile where name="c:\\Windows\\System32\\cmd.exe" GET /VALUE
      
      





/ VALUE-すべての可能な情報を取得します



bashでは、このように見えます



 cmd.exe /C "wmic datafile where name='c:\\\\Windows\\\\System32\\\\cmd.exe' GET /VALUE"
      
      





たくさんのスラッシュと必要なものすべて



ただし、表示するだけでなく、受信して処理する必要があります。



したがって、PHPでは次のようになります。



 //   $file='c:\Windows\System32\cmd.exe'; //    WMI $q="/mnt/c/Windows/System32/cmd.exe /C \"wmic datafile where name='".addslashes(addslashes($file))."' GET /VALUE\""; $a=exec($q,$b); $ini=implode("\n",$b);
      
      





/mnt/c/Windows/System32/cmd.exe-絶対パス

$ bは複数行の結果なので、配列として取得します(最後の行のみが$ aになります)

$ ini-結果の形式はiniファイルと互換性があります。使用しないのは罪です。結果の$ b配列をparse_ini_string()を使用した後続の変換のためにテキストに変換します。



方法2-Scripting.FileSystemObjectを使用する



ここでこの解決策を見つけて、少し追加しました。



元のバージョンでは、結果が記載された短いリストへの呼び出しがありましたが、私には不向きでした



 WScript.Echo(objFolder.GetDetailsOf(objItem,-1));
      
      





この行を、考えられるすべてのファイルプロパティを抽出するループに置き換えました



 var folder=objShell.NameSpace(namespace); for (var i=0; i<0xFFFF; i++) { fileinfo=folder.GetDetailsOf(null, i); if (!fileinfo) { break; } WScript.Echo( fileinfo+" = "+objFolder.GetDetailsOf(objItem,i) ); }
      
      





出力形式は、iniファイルと互換性があります。



batファイルを呼び出すPHPコードは次のようになりました



 $q1="/mnt/c/Windows/System32/cmd.exe /C \"C:\\test_exe\\test_exe.bat ".addslashes($file)."\""; $a1=exec($q1,$b1); $ini1=implode("\n",$b1); $ini1=iconv("CP866","UTF-8", $ini1);
      
      





WMIの場合とほぼ同様に、結果をUnicodeにトランスコードするだけで済みます。 (CP866-涙が出る)



結果を単一のテキストとパーシムに接着します



 $result_ini="[WMIC]\n".$ini."\n[FileSystemObject]\n".$ini1; $result_arr = parse_ini_string($result_ini, true, INI_SCANNER_RAW); print_r($result_arr);
      
      





パーティションをセクションに分割し(2番目のパラメーターがtrue)、オンにする問題を回避するために-INI_SCANNER_RAW



VZHUHと私たちは、作業に便利なファイルのすべての可能なプロパティの配列を受け取ります。



 ~$ cd /mnt/c/test_exe/ /mnt/c/test_exe$ php test_exe.php
      
      





Array

(

[WMIC] => Array

(

[AccessMask] => 1179817

[Archive] => TRUE

[Caption] => c:\windows\system32\cmd.exe

[Compressed] => FALSE

[CompressionMethod] =>

[CreationClassName] => CIM_LogicalFile

[CreationDate] => 20170318235750.921718+180

[CSCreationClassName] => Win32_ComputerSystem

[CSName] =>

[Description] => c:\windows\system32\cmd.exe

[Drive] => c:

[EightDotThreeFileName] => c:\windows\system32\cmd.exe

[Encrypted] => FALSE

[EncryptionMethod] =>

[Extension] => exe

[FileName] => cmd

[FileSize] => 271872

[FileType] => Application

[FSCreationClassName] => Win32_FileSystem

[FSName] => NTFS

[Hidden] => FALSE

[InstallDate] => 20170318235750.921718+180

[InUseCount] =>

[LastAccessed] => 20170318235750.921718+180

[LastModified] => 20170318235750.921718+180

[Manufacturer] => Microsoft Corporation

[Name] => c:\windows\system32\cmd.exe

[Path] => \windows\system32\

[Readable] => TRUE

[Status] => OK

[System] => FALSE

[Version] => 10.0.15063.0

[Writeable] => TRUE

)



[FileSystemObject] => Array

(

[] => cmd.exe

[] => 265

[ ] =>

[ ] => 18.03.2017 23:57

[ ] => 18.03.2017 23:57

[ ] => 18.03.2017 23:57

[] => A

[] =>

[] =>

[ ] =>

[] => TrustedInstaller

[] =>

[ ] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[] =>

[ ] => c Microsoft Corporation. All rights reserved.

[№] =>

[] =>

[ ] =>

[ ] =>

[, ] =>

[] =>

[, ] =>

[] => Microsoft Corporation

[ ] => Windows Command Processor

[ ] =>

[ ] =>

[] =>

[ ] =>

[] =>

[] =>

[ ] =>

[ ] =>

[ ] =>

[ ] =>

[ ] =>

[ ] =>

[ ] =>

[] =>

[ ] =>

[/] =>

[ ] => 227

[ ] =>

)



)







このバーコードは何のためにありましたか? しかし、何に。



前述したように、Microsoftは、PowerShellで牛を描き、bashからnotepad.exeを実行できるようになったと述べました。



そして、 このMicrosoftテキストの翻訳の議論で人々はLinuxがどれほど正直であり、Dockerをその上に積み込めるかどうかを知ります。



人々、あなたはそこを見ていません! 私はbashPHPスクリプトを実行し、 exec()を介して、 JScriptActiveXObjectを作成したbatファイルを起動しました。



それは一種の魔法です!



そして、私は次のようにCMDからそれを行うことができます:



 C:\test_exe>bash -c "php test_exe.php"
      
      





ああ!



ケース番号2



私は6日にWindows 10 Creators Updateをリリースしましたが、先週、簿記によって新しいおもちゃから気を取られました。 簿記は、プライマリのオリジナルを要求しました。



交響詩、エウレカセブン



私たちはbashに登り、プログラムを実行するだけです



 ~$ 2Printer.exe -s "c:\2Printer\_input\*.*"
      
      





結果-リーフレットがプリンターからクロールされます:



画像

(このスクリーンショットは仮想プリンターでの後続のシミュレーションですが、実際のHPでも機能しました)



その結果、次のことができます。





つまり、単純なスクリプトを作成できるだけでなく、複雑なプログラムも使用できます。



まとめ



私はこれで他に何をするべきかをまだ完全に理解していませんが、このことは単に牛と話をしてLAMPを起動するだけではありません。



「LinuxとWindowsのどちらか」という二分法から抜け出し、最も信じられないほどの割合と順序でハリネズミとヘビを横断し始める必要があります。



All Articles