我的主文件夹中有一些脚本,我想从命令行运行,实际上是从任务计划程序运行,但我找不到这样做的方法。
我试过了
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 地址。