Lo crea o no, ¿puede llamar libremente a objetos y funciones de aardio en PowerShell sin ningún código complejo? ! aardio ahora soporta este tipo de jugabilidad, solo mira el código sin tonterías:


var ps1 = /*     # 定义命名参数    param($win,$external,$username)        # 自由调用参数传进来的 aardio 对象    $win.msgboxTest("这是 PowerShell 调用 aardio 打开的对话框。") #返回值会自动输出一行        # 自由调用 aardio 函数     $external.func("参数1","参数2")  */
import win;import dotNet.ps;var output = dotNet.ps(ps1,{ win = win; //参数名前不要加$或- external = { func = function(title,text){ win.msgbox(text,title) } }; });

Muy mágico, puede llamar objetos aardio y funciones aardio arbitrariamente en PowerShell. No es necesario escribir ningún código complicado.

El parámetro @1 de dotNet.ps(script,param) es el script de PowerShell y el parámetro @2 es el parámetro para llamar al script. Este parámetro puede ser un objeto de tabla. El par nombre-valor en la tabla de parámetros es el uno que especifica PowerShell Parámetros con nombre. Los miembros de la matriz en una tabla de matriz son parámetros anónimos.

Un ejemplo de un parámetro anónimo:

var ps1 = /*   for ( $i=0; $i -lt $args.count; $i++){    write-host $args[$i]}  */
import dotNet.ps;var output = dotNet.ps(ps1,{ "匿名参数1","匿名参数2","匿名参数3","匿名参数4"}); import console;console.log(output); console.pause();

Los parámetros anónimos también se pueden escribir así:

dotNet.ps(ps1,"匿名参数1","匿名参数2","匿名参数3","匿名参数4");

Si desea ejecutar un comando, también puede usar la función dotNet.ps.command(). El método para pasar parámetros es exactamente el mismo que usar dotNet.ps. Ejemplo:

import dotNet.ps;var output = dotNet.ps.command("Get-Command",{Name="*Process"});
import console;console.logPause(output);

Por defecto, la salida de PowerShell, por ejemplo, con Write-Host, Write-Output se captura automáticamente y se devuelve en el valor de retorno de la función. También puede especificar una función de devolución de llamada para recibir datos de salida de PowerShell, por ejemplo:

import console;import dotNet.ps;dotNet.ps.onWrite = function(str){  console.log(str)} dotNet.ps.command("Get-Command",{Name="*Process"});console.pause(output);

Alternativamente, podemos especificar la devolución de llamada dotNet.ps.onWriteProgress para personalizar la barra de progreso de PowerShell, un ejemplo:

imagen

El código fuente está aquí:
aardio viene con ejemplos / llamar a otros idiomas / PowerShell / barra de progreso

imagen

Hay algunos gadgets convenientes en el ejemplo anterior. Por ejemplo, el sistema prohíbe la ejecución de PowerShell de forma predeterminada. Por supuesto, la ejecución de scripts de PowerShell en aaradio no estará restringida. Esta restricción significa que los archivos de script *.ps1 no se pueden ejecutar por separado fuera aardio El ejemplo proporciona una pequeña herramienta: puede activar o desactivar este permiso con un solo clic:

imagen

Los scripts suelen ser más sensibles, a diferencia de los EXE, que pueden parecer tener más falsos positivos en la superficie, pero no es demasiado difícil detectar los excesos de blanco. Sin embargo, algunas funciones del script están prohibidas, lo que básicamente no tiene solución.

Si no desea modificar la configuración de permisos del sistema, aardio proporciona una función para ejecutar el script ps1 directamente, por ejemplo:

import process.popen;var ps1  = process.popen.ps1("/test.ps1");ps1.readAll()

Hay muchos Cmdlets en PowerShell escritos en C#, y el software escrito en C# puede usar ILSpy para ver el código fuente directamente. De hecho, es interesante mirar el código fuente de algunos Cmdlets  , pero hay muchos pasos en esta operación. También escribí una pequeña herramienta que puede enumerar directamente todos los comandos, buscar y consultar, y llamar a ILSpy para descompilar el código fuente. con un clic:

imagen

Otro ejemplo de llamada a process.popen para crear una canalización de proceso para ejecutar comandos de PowerShell:

import console;import process.popen;
console.showLoading(" 请稍候,正在调用 PowerShell");var prcs = process.popen.ps(`-Command "& {Get-Command -Name *Process}"`);
var result = prcs.readAll(); console.log(result);console.pause();