使用 wsl 运行多个命令

问题描述 投票:0回答:5

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

我已经尝试过了

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

但是不起作用。

如何在同一个会话下串联执行多个命令?

windows windows-subsystem-for-linux batch-processing
5个回答
10
投票

您需要转义 &&,以便 powershell 不会将它们视为不同的命令,要将 && 传递给 wsl,请执行以下操作:

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


6
投票

您需要将这些命令传递给 WSL(不带引号),以便 bash 将它们正确解释为一系列链接在一起的命令,而不是单个长命令。不幸的是,当您这样做时,“&&”运算符会被 Windows 命令行解释器解释,并且后面的命令不会传递到 WSL。

我发现有效的方法是将“&&”(仅当前面的命令成功退出时才运行命令)运算符替换为简单的“;” (无论前面的命令如何退出,都运行命令)。那么在你的情况下,这样的事情应该有效:

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

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


6
投票
C:\Windows\System32\wsl.exe -d Ubuntu -u jlanza sh -c ". ~/.profile && script-jlanza.sh"

通过这种方式,我可以加载自己的配置文件,然后就可以运行命令。

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


0
投票

您可以使用以下语法方便地运行整个 bash 脚本(带有多行命令、内置命令等)。该代码使用 Powershell Here-String 定义多行 bash 脚本,然后使用

bash
:
 将其通过管道传输到 
wsl.exe

命令的标准输入
@" 
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 地址。


0
投票

如果您在 CMD 中运行此命令,请执行以下操作

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

技巧是使用“^”转义所有特殊字符。

© www.soinside.com 2019 - 2024. All rights reserved.