我的主文件夹上有一些脚本,我想从命令行运行,实际上是从任务计划程序运行,但我找不到这样做的方法。
我已经尝试过了
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:\Windows\System32\wsl.exe -d Ubuntu -u jlanza sh -c ". ~/.profile && script-jlanza.sh"
通过这种方式,我可以加载自己的配置文件,然后就可以运行命令。
该选项只是运行 sh 或任何 shell,然后在该 shell 中执行您想要的命令。另一个答案也是有效的,但我最喜欢我的,因为我可以使用用户配置文件(路径、别名等)
您可以使用以下语法方便地运行整个 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 地址。
如果您在 CMD 中运行此命令,请执行以下操作
wsl -u Ubuntu -u jlanza cd /home/jlanza/bin ^&^& ./myscript ^&^& ./myotherscript
技巧是使用“^”转义所有特殊字符。