使用 wsl 运行多个命令



我的主文件夹中有一些脚本,我想从命令行运行,实际上是从任务计划程序运行,但我找不到这样做的方法。

我试过了

wsl -u Ubuntu -u jlanza "cd /home/jlanza/bin && ./myscript && ./myotherscript"

但它不起作用。

如何在同一会话下连接多个命令的执行?

你需要转义 &&,所以 powershell 不会将它们视为不同的命令,要传递给 &&到 wsl,请执行以下操作:wsl -d Ubuntu -u jlanza -- cd /home/jlanza/bin `&`& ./myscript `&`& ./myotherscript

需要将这些命令传递给不带引号的 WSL,以便 bash 将它们正确解释为一系列链接在一起的命令,而不是单个长命令。遗憾的是,执行此操作时,"&&"运算符将由 Windows 命令行解释器解释,并且以下命令不会传递给 WSL。

我发现有效的方法是将"&&"(仅当前面的命令成功退出时才运行命令(运算符替换为简单的";"(运行命令,而不考虑前面的命令如何退出(。那么在您的情况下,这样的事情应该有效:

cmd /c "wsl -u Ubuntu -u jlanza cd /home/jlanza/bin; ./myscript; ./myotherscript"

但是,如果你的用例需要使用"&&"运算符,我会尝试将正在运行的命令保存为 WSL 中的脚本或 shell 别名。调用它将省去通过 Windows 命令行解释器传递"&&"的需要。

C:WindowsSystem32wsl.exe -d Ubuntu -u jlanza sh -c ". ~/.profile && script-jlanza.sh"

这样,我加载自己的配置文件,然后就可以运行命令了。

选项只是运行sh或任何shell,然后在该shell中执行您想要的命令。另一个答案也是有效的,但我最喜欢我的,因为我能够使用用户配置文件(路径、别名等(

您可以使用以下语法方便地运行整个 bash 脚本(使用多行命令、内置等(。该代码使用 Powershell Here-String 定义一个多行 bash 脚本,然后使用wsl.exe将其管道传输到bash命令的 stdin

@" 
echo abc; 
h=`$(hostname); echo "Hostname is `$h";
echo "lsb_release is `$(lsb_release -a)";
"@ | wsl -- bash

请注意,'$'被转义到 powershell 中的'`$',以防止变量替换。

下面是一个更复杂的示例,它使用 WSL 上的临时 Ansible 配置来测试 WinRM 与 Windows 主机的连接(这假设 WinRM 已经设置(:

Write-Output "Testing Ansible on WSL connection to $(hostname) ($(Get-WindowsIp))"
# Ad-Hoc inventory written to a temp file
$Inventory = @"
[windows]
windows10 ansible_host=$(Get-WindowsIp)
[windows:vars]
ansible_user=$([Environment]::UserName)
ansible_password=$(Read-Host 'SSH Password')
ansible_port=5986
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_server_cert_validation=ignore
"@
# (Powershell) Pipe ansible test script to stdin of bash
@"
tmpfile="`$(mktemp -p /tmp/)";
cat >`$tmpfile <<"EOF"
$Inventory
EOF
# win_ping windows host, using the above inventory.
ansible windows -i `$tmpfile -m win_ping
"@ | wsl -- bash

Get-WindowsIp是单独定义的,用于检索 Windows 主机的 IP 地址。

最新更新