<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>PowerShell on KnightLi Blog</title>
        <link>https://knightli.com/es/tags/powershell/</link>
        <description>Recent content in PowerShell on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Wed, 01 Jul 2026 10:06:48 +0800</lastBuildDate><atom:link href="https://knightli.com/es/tags/powershell/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Codex contra PowerShell: qué resuelve el Skill powershell-safe-invocation</title>
        <link>https://knightli.com/es/2026/07/01/codex-vs-powershell-safe-invocation/</link>
        <pubDate>Wed, 01 Jul 2026 10:06:48 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/07/01/codex-vs-powershell-safe-invocation/</guid>
        <description>&lt;p&gt;Hace poco vi una captura con mucho efecto cómico: Codex intentaba corregir un archivo Markdown en PowerShell. Primero el here-string no se ejecutaba, luego fallaba la coincidencia CRLF/LF, después los backticks de Markdown eran interpretados por PowerShell, las barras invertidas de las rutas se comportaban de forma inestable y la sintaxis del argumento &lt;code&gt;-split&lt;/code&gt; volvía a causar problemas. El modelo seguía diagnosticándose a sí mismo y parcheando el script. Al final, en los comentarios le pusieron un título muy acertado: el clásico GPT 5.5 contra PowerShell.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://knightli.com/2026/07/01/codex-vs-powershell-safe-invocation/codex-powershell-battle.jpg&#34;
	width=&#34;1080&#34;
	height=&#34;2400&#34;
	srcset=&#34;https://knightli.com/2026/07/01/codex-vs-powershell-safe-invocation/codex-powershell-battle_hu_5b7da40f3bf17d89.jpg 480w, https://knightli.com/2026/07/01/codex-vs-powershell-safe-invocation/codex-powershell-battle_hu_a1711b2e97eccd27.jpg 1024w&#34;
	
		loading=&#34;eager&#34;
		fetchpriority=&#34;high&#34;
		decoding=&#34;sync&#34;
	
	
		alt=&#34;Captura de Codex corrigiendo repetidamente un script en PowerShell&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;45&#34;
		data-flex-basis=&#34;108px&#34;
	
&gt;
&lt;/p&gt;
&lt;p&gt;La cadena de correcciones de la captura tiene gracia, pero los problemas de fondo no son raros.&lt;/p&gt;
&lt;p&gt;Funciona como broma porque se parece mucho a una sesión real de desarrollo. PowerShell no es simplemente &amp;ldquo;Bash para Windows&amp;rdquo;. Tiene sus propias reglas de cadenas, reglas de enlace de parámetros, modelo de errores de cmdlets y forma de pasar argumentos a comandos nativos. Cuando un agente lleva hábitos de Bash a PowerShell, tareas aparentemente normales como escribir archivos, reemplazar texto o invocar programas externos pueden convertirse en una secuencia de pequeños fallos.&lt;/p&gt;
&lt;p&gt;El skill &lt;a class=&#34;link&#34; href=&#34;https://github.com/Misaka-Mikoto-Tech/agent-skills/tree/main/skills/powershell-safe-invocation&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;powershell-safe-invocation&lt;/a&gt; de Misaka-Mikoto-Tech reúne estos tropiezos en un conjunto compacto de reglas. No se trata de memorizar más sintaxis de PowerShell. Se trata de decirle al agente que, al ejecutar comandos en Windows, elija primero formas de invocación con menos probabilidades de fallar.&lt;/p&gt;
&lt;h2 id=&#34;el-problema-principal-no-es-que-powershell-sea-difícil-sino-que-los-agentes-lo-tratan-como-bash&#34;&gt;El problema principal no es que PowerShell sea difícil, sino que los agentes lo tratan como Bash
&lt;/h2&gt;&lt;p&gt;La captura muestra varios problemas típicos.&lt;/p&gt;
&lt;p&gt;La primera categoría son las cadenas y los saltos de línea. Markdown usa backticks, y PowerShell también trata los backticks como caracteres de escape. Un documento puede usar CRLF mientras el script intenta coincidir exactamente con LF. Si el inicio o el cierre de un here-string tiene mal la indentación o las comillas, puede que ni siquiera genere el texto esperado.&lt;/p&gt;
&lt;p&gt;La segunda categoría son las rutas y los argumentos. Las rutas de Windows contienen barras invertidas por naturaleza, y los directorios suelen incluir espacios, corchetes o caracteres chinos. Si se construye un comando como una sola cadena enorme antes de ejecutarlo, un argumento puede dividirse de forma inesperada, o un fragmento de ruta puede interpretarse como escape, comodín, expresión regular o sintaxis de otro shell.&lt;/p&gt;
&lt;p&gt;La tercera categoría es la gestión de errores. Los programas externos deben comprobarse con &lt;code&gt;$LASTEXITCODE&lt;/code&gt;; los cmdlets de PowerShell deberían depender de errores terminantes y de &lt;code&gt;$ErrorActionPreference = &#39;Stop&#39;&lt;/code&gt;. Si un agente mezcla estos dos modelos, puede acabar creyendo que un comando tuvo éxito cuando no fue así.&lt;/p&gt;
&lt;p&gt;Nada de esto es un fallo enorme por sí solo, pero consume atención. Los agentes también pueden seguir reparando una suposición equivocada simplemente porque &amp;ldquo;parece que el comando ya se ejecutó&amp;rdquo;, y el bucle se vuelve cada vez más enredado.&lt;/p&gt;
&lt;h2 id=&#34;la-regla-central-de-este-skill-no-construir-una-cadena-de-comando-gigante&#34;&gt;La regla central de este skill: no construir una cadena de comando gigante
&lt;/h2&gt;&lt;p&gt;La regla más importante de &lt;code&gt;powershell-safe-invocation&lt;/code&gt; es no concatenar el ejecutable, las rutas, los argumentos y las comillas en una cadena de comando gigante.&lt;/p&gt;
&lt;p&gt;Al invocar un programa nativo, cada argumento debe ser un elemento independiente del array:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$exe&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Path With Spaces\tool.exe&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$args&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;--input&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Data Folder\input.json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;--flag&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$exe&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;@args&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$exitCode&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$LASTEXITCODE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$exitCode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-ne&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$exe&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; failed with exit code &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$exitCode&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto parece más largo que un comando de una línea, pero separa los riesgos: una ruta es una ruta, un argumento es un argumento y la invocación es la invocación. El agente ya no tiene que adivinar si una capa de comillas pertenece a PowerShell, a cmd o al programa de destino.&lt;/p&gt;
&lt;p&gt;Para cmdlets de PowerShell, suele encajar mejor el splatting con hashtable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$params&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;LiteralPath&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Data[1]\input.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Destination&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;C:\Output&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;Force&lt;/span&gt;       &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;$true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;ErrorAction&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Stop&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Copy-Item&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;@params&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El punto clave aquí es &lt;code&gt;-LiteralPath&lt;/code&gt;. Las rutas reales deberían tratarse como literales por defecto. Usa parámetros que expanden comodines solo cuando esa expansión sea intencional. Para un agente, esto es mucho más estable que intentar decidir sobre la marcha si una ruta contiene &lt;code&gt;[&lt;/code&gt;, &lt;code&gt;]&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt; o &lt;code&gt;?&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;no-metas-comandos-complejos-dentro-de--command&#34;&gt;No metas comandos complejos dentro de &lt;code&gt;-Command&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Muchos problemas de automatización en Windows empiezan con un comando como este:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cmd.exe /c pwsh.exe -Command &amp;#34;...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En cuanto aparecen JSON, XML, expresiones regulares, pipelines, redirecciones, texto multilínea, rutas no ASCII o backticks de Markdown, las capas de escape se vuelven difíciles de controlar. Es complicado de leer para una persona y todavía más fácil de malinterpretar para un agente.&lt;/p&gt;
&lt;p&gt;La recomendación del skill es simple: cuando el comando sea aunque sea un poco complejo, escribe un archivo temporal &lt;code&gt;.ps1&lt;/code&gt; y ejecútalo con &lt;code&gt;pwsh.exe -NoLogo -NoProfile -NonInteractive -File script.ps1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esta regla es especialmente adecuada para agentes. Después de generar el archivo de script, el agente puede revisar el contenido, ejecutarlo y verificar las diferencias de archivos paso a paso. Si todo se mete en un único &lt;code&gt;-Command&lt;/code&gt;, cuando algo falla solo queda una maraña de comillas y escapes para depurar.&lt;/p&gt;
&lt;h2 id=&#34;powershellexe-no-es-pwshexe&#34;&gt;&lt;code&gt;powershell.exe&lt;/code&gt; no es &lt;code&gt;pwsh.exe&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Otro punto fácil de pasar por alto es la versión.&lt;/p&gt;
&lt;p&gt;Instalar PowerShell 7 no hace que &lt;code&gt;powershell.exe&lt;/code&gt; se convierta automáticamente en PowerShell 7. Normalmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;powershell.exe&lt;/code&gt; es Windows PowerShell 5.1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwsh.exe&lt;/code&gt; es PowerShell 7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambos difieren en el paso de argumentos a comandos nativos, valores predeterminados de codificación y otros detalles de comportamiento. Si un agente no sabe en qué shell se está ejecutando, debería comprobarlo primero:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$PSVersionTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;PSVersion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$PSNativeCommandArgumentPassing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No es un ritual. Muchos problemas de &amp;ldquo;en mi máquina funciona, pero cuando lo ejecuta el agente falla&amp;rdquo; vienen de diferencias en la versión del shell y las reglas de paso de argumentos.&lt;/p&gt;
&lt;h2 id=&#34;al-escribir-archivos-la-codificación-y-los-saltos-de-línea-son-asuntos-de-primer-orden&#34;&gt;Al escribir archivos, la codificación y los saltos de línea son asuntos de primer orden
&lt;/h2&gt;&lt;p&gt;La parte más interesante de la captura es cómo el agente da vueltas alrededor de reemplazos fallidos en un archivo Markdown. Ahí hay al menos tres supuestos ocultos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cuál es la codificación real del archivo&lt;/li&gt;
&lt;li&gt;si el archivo usa CRLF o LF&lt;/li&gt;
&lt;li&gt;si el objetivo de reemplazo fue alterado por la sintaxis de cadenas de PowerShell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cuando se mezclan un artículo en chino, bloques de código Markdown, front matter, shortcodes y backticks, es mejor no escribir el cuerpo con un here-string improvisado de PowerShell. O bien se usan APIs de archivo con codificación explícita, o bien el script maneja solo lógica de control ASCII y el texto no ASCII se escribe por una ruta más fiable.&lt;/p&gt;
&lt;p&gt;Para flujos de trabajo con agentes, hay una costumbre adicional: verificar inmediatamente después de escribir. Como mínimo, comprobar que el archivo se puede leer como UTF-8, que el front matter está cerrado, que los enlaces Markdown no se rompieron y que el cuerpo no contiene signos de interrogación repetidos ni mojibake evidente. Los problemas de codificación son más baratos cuanto antes se encuentran.&lt;/p&gt;
&lt;h2 id=&#34;un-orden-de-decisión-más-estable&#34;&gt;Un orden de decisión más estable
&lt;/h2&gt;&lt;p&gt;La parte más práctica de este skill es que le da al agente un orden de decisión:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Si basta con un cmdlet de PowerShell, usa el cmdlet.&lt;/li&gt;
&lt;li&gt;Al invocar un programa externo, usa &lt;code&gt;&amp;amp; $exe @args&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cuando el comando sea complejo, escribe un archivo &lt;code&gt;.ps1&lt;/code&gt; y ejecútalo con &lt;code&gt;pwsh.exe -File&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cuando sea necesario controlar con precisión los argumentos del proceso, usa &lt;code&gt;ProcessStartInfo.ArgumentList&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;Start-Process&lt;/code&gt; solo para comportamientos especiales como una ventana nueva, elevación o ejecución desacoplada.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;cmd.exe /c&lt;/code&gt; solo cuando realmente se necesite la semántica de cmd.&lt;/li&gt;
&lt;li&gt;Deja &lt;code&gt;Invoke-Expression&lt;/code&gt; como último recurso muy controlado.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este orden convierte &amp;ldquo;se ejecuta&amp;rdquo; en &amp;ldquo;se puede explicar, comprobar y reproducir&amp;rdquo;. Eso importa para desarrolladores humanos, y todavía más para agentes.&lt;/p&gt;
&lt;h2 id=&#34;consejos-prácticos-para-codex&#34;&gt;Consejos prácticos para Codex
&lt;/h2&gt;&lt;p&gt;Si le pido a Codex que edite archivos en un repositorio de Windows, le daría algunas restricciones claras:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No usar escapes de estilo Bash como &lt;code&gt;\&amp;quot;&lt;/code&gt; en PowerShell.&lt;/li&gt;
&lt;li&gt;No concatenar rutas y argumentos en una gran cadena.&lt;/li&gt;
&lt;li&gt;No usar &lt;code&gt;Start-Process -ArgumentList&lt;/code&gt; para argumentos complejos.&lt;/li&gt;
&lt;li&gt;No envolver llamadas normales con &lt;code&gt;cmd.exe /c&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Preferir &lt;code&gt;-LiteralPath&lt;/code&gt; para rutas reales de archivos.&lt;/li&gt;
&lt;li&gt;Para scripts complejos, preferir escribir un &lt;code&gt;.ps1&lt;/code&gt; y ejecutarlo con &lt;code&gt;pwsh.exe -File&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Después de escribir contenido en chino, japonés u otro texto no ASCII, comprobar la codificación y posibles señales de corrupción.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerShell no es el enemigo de los agentes. El verdadero problema es que los agentes caen demasiado fácilmente en el viejo hábito de &amp;ldquo;concatenar una cadena y dejar que el shell adivine&amp;rdquo;. Una vez que los límites de invocación están claros, PowerShell puede ofrecer una capacidad estructurada bastante fuerte.&lt;/p&gt;
&lt;p&gt;Así que la conclusión de esta historia de &amp;ldquo;Codex contra PowerShell&amp;rdquo; no es que los agentes deban evitar Windows. Es que necesitan un manual táctico: apostar menos por las comillas y usar más estructura; meter menos cosas en un comando de una línea y conservar más estados intermedios que se puedan inspeccionar.&lt;/p&gt;
&lt;p&gt;La broma está en la captura. La lección está en las reglas.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
