首页 > 解决方案 > 如何在节点脚本中将 CMD 命令链接到 WSL

问题描述

我有一个节点服务器,我想在启动它之前启动它所依赖的一切。该包在 Windows 上运行,但依赖于 WSL 中的多容器 docker 设置。

所以我试过了


  "scripts": {
    "start": "wsl 'sudo service docker start && docker-compose up -d' && nodemon server.js --config nodemon.json",
  },

但它抛出

> Executing task: npm run start <

> wsl 'sudo service docker start && docker-compose up -d' && nodemon server.js --config nodemon.json

zsh:1: unmatched '
The terminal process "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command npm run start" terminated with exit code: 1.

这样做的正确语法是什么?

标签: npmwindows-subsystem-for-linux

解决方案


你确实有不匹配的引号,但我假设这只是尝试一堆不同编辑的产物;-)。

将脚本(多个命令)传递给命令的最佳方法wsl是将其传递给sh(或bash如果需要)。现在只考虑 WSL 部分,那就是:

wsl -e sh -c "sudo service docker start && docker-compose up -d"

从您收到的错误消息来看,这似乎正在被解析powershell.exe,我认为它不支持&&链接。如果我理解正确,那只能在 PowerShell Core ( pwsh.exe) 中使用。

这样就可以生成完整的命令(希望如此):

wsl -e sh -c "sudo service docker start && docker-compose up -d"; nodemon server.js --config nodemon.json

引用应该不会太糟糕,所以希望:

"scripts": {
    "start": "wsl -e sh -c 'sudo service docker start && docker-compose up -d'; nodemon server.js --config nodemon.json",
  },

当然没有直接测试,但如果它不适合你,请告诉我,我可以检查我可能做错了什么。

如果您确实需要根据先前成功的命令“链接”,那么也许考虑以下内容:

wsl -e sh -c "sudo service docker start && docker-compose up -d && powershell.exe nodemon server.js --config nodemon.json"

...这又很容易引用。但如果这不起作用(或者您最终需要在 PowerShell 中运行的多个命令),那么引用开始变得更加困难:

wsl -e sh -c "sudo service docker start && docker-compose up -d && powershell.exe -c \`"nodemon server.js --config nodemon.json\`""

推荐阅读