为何Deno脚本在不同目录执行时stdout返回结果不同?
Deno调用PowerShell执行
ls无输出的原因分析 问题代码
import * as path from "https://deno.land/std@0.188.0/path/mod.ts"; async function getStdout() { const dirname = path.dirname(path.fromFileUrl(import.meta.url)) const cmd = new Deno.Command("pwsh", { args: ['-c', 'ls', dirname] }); const { _code, stdout, _stderr } = await cmd.output(); const decodedStdout = new TextDecoder().decode(stdout) console.log(decodedStdout) } await getStdout()
问题现象
该脚本在目录A中运行正常,但在目录B中执行时无输出(目录B下存在文件,直接在该目录执行ls可正常显示内容);将ls替换为echo后,在目录B中能正常输出结果。
根本原因
问题出在PowerShell -c参数的参数传递逻辑:
- PowerShell的
-c(-Command)参数仅接受单个字符串作为要执行的命令内容。 - 代码将
ls和dirname拆成独立参数传给pwsh,此时PowerShell仅会把第一个参数ls当作-c的命令执行,后面的dirname会被当作PowerShell进程的位置参数($args[0]),但ls命令并没有使用这个参数。 - 目录A恰好是Deno的当前工作目录,所以
ls默认列出当前目录内容,有输出;而目录B不是当前工作目录,ls列出的是Deno运行时的当前工作目录(而非脚本所在的dirname),若该目录为空就会无输出。 - 换成
echo时,echo默认会输出所有位置参数,所以dirname被打印,看起来正常,但这是参数传递错误导致的巧合。
修复方案
方案1:将命令拼接为单个字符串
const cmd = new Deno.Command("pwsh", { args: ['-c', `ls "${dirname}"`] });
注意:路径含空格时需用引号包裹,避免解析错误。
方案2:利用PowerShell的位置参数传递
const cmd = new Deno.Command("pwsh", { args: ['-c', 'ls $args[0]', dirname] });
这种方式更安全,无需手动处理路径中的特殊字符。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

