如何从WSL调用PowerShell脚本?

13

在我的Windows目录下

C:\Users\jholmes\pichak\analytics

我已经运行了run1.ps1代码。 我运行了wsl.exe,现在我的pwd是

   /mnt/c/WINDOWS/system32

如何指向第一个路径并执行脚本?

嘿,你试过从你的PWD遍历回来吗?cd .. 然后遍历到 \Users\jholmes\pichak\analytics 吗?另外,你想如何在Linux中执行 .ps1脚本? - AvidJoe
@AvidJoe 不可能,我在执行“cd ..”命令后仍然停留在Linux系统中。 - MikiBelavista
我不确定我理解你的问题。如果你已经在Ubuntu或任何子系统中,访问Windows目录的挂载点是mnt/,你可以从mnt/遍历到任何Windows卷,例如/mnt/c/Users/jholmes/pichak/analytics可以从你的Linux子系统中访问。当你说我运行wsl.exe时,我不确定你的意思。如果不是这种情况,我可能也在浪费你的时间。哈哈..抱歉。 - AvidJoe
1
如果您希望从Linux运行Windows工具(如PowerShell),请参见:https://learn.microsoft.com/en-us/windows/wsl/interop#run-windows-tools-from-linux,如果您希望反过来,请参见https://learn.microsoft.com/en-us/windows/wsl/interop#run-linux-tools-from-a-windows-command-line。在您的情况下,使用cd返回并使用powershell <path>运行。 - AvidJoe
6个回答

12
在WSL2中,对我而言使用-File选项起作用:
powershell.exe -File path/to/script.ps1

运行 powershell.exe -F ~/win/common/utils/fix_wsl.ps1 命令时,出现错误提示:参数 '/home/user/win/common/utils/fix_wsl.ps1' 无法传递给 -File 参数,因为该文件不存在,请提供一个已存在的 '.ps1' 文件路径作为 -File 参数的参数。 - Krishna
切换到目录并在当前目录中执行带有文件的PowerShell是可行的。 - Krishna

7

在 PowerShell 中运行 wsl (或 wsl.exe)时,它应该以与 PowerShell 下相同的目录启动,只是使用 Linux 版本。例如,如果你在 PowerShell 中的路径为 C:\Users\jholmes\pichak\analytics,并且运行了 wsl,那么你应该会在 /mnt/c/Users/jholmes/pichak/analytics 中。

如果不是这样,那么你可能已经在你的启动文件中加入了类似其他答案建议的内容。你应该从你的 .bashrc.zshrc.profile.bash_profile 或任何其他你编辑过的启动文件中删除任何 cd 命令。

wsl 命令提供了一些方便的参数来指定起始目录:

  • wsl ~ 将在你的 Linux 用户主目录下启动(例如 /home/jholmes
  • wsl --cd c:\ 将在 /mnt/c(或者相当于传入的 Windows 版本的 Linux 目录)中启动。
  • wsl --cd \\wsl$\<distroname>\etc 将在你的 /etc 目录下启动(或者你传入的 WSL 路径)。请注意,你需要指定你所使用的发行版名称(通过 wsl -l -v 获得)。

假设你在 /home/jholmes 中,想要执行 PowerShell 脚本 C:\Users\jholmes\pichak\analytics\run1.ps1。你首先需要将 Windows 路径翻译成 Linux 版本:

/mnt/c/Users/jholmes/pichak/analytics/run1.ps

然后可以通过以下方式运行它:

powershell.exe /mnt/c/Users/jholmes/pichak/analytics/run1.ps

也可以设置一个带有 "shebang" 行的 PowerShell 脚本以便直接执行。如果你在 run1.ps1 的第一行添加以下内容:

#!/usr/bin/env -S powershell.exe -ExecutionPolicy Bypass

然后通过chmod +x /mnt/c/Users/jholmes/pichak/analytics/run1.ps将其设置为可执行文件,这样它就成为某种类型的"命令"(技术上来说是"可执行脚本"),您只需在命令行中键入脚本的完全限定名称即可直接执行它:

/mnt/c/Users/jholmes/pichak/analytics/run1.ps

或者
cd /mnt/c/Users/jholmes/pichak/analytics
./run1.ps

3
有两种方法可以操作:
  1. 您可以将工作目录更改为您的shell脚本所在的目录,并正常执行它。要执行此操作,请按照以下步骤操作:
  • 挂载相关驱动器 cd /mnt/c/
  • 根据脚本的路径更改目录。
  1. 这种方法更像是一种我为了方便而使用的hack。我已经在我的Windows存储中创建了一个文件夹,其中我存储所有Ubuntu WSL相关的文件。比如,D:\Ubuntu。为了避免每次打开WSL时都要更改工作目录,您可以修改shell配置文件(bashrc,zshrc等)以在末尾加载相关目录。
  • 即,在您的~/.zshrc文件的末尾添加cd /mnt/d/Ubuntu/,如果您使用zsh,则在其他相关配置文件中添加。

1
真的建议新用户(至少)远离“在启动配置中添加cd”的黑客技巧。我看到太多人因为这样做而遇到问题,最终导致混乱。 - NotTheDr01ds

2

对我来说,这个答案几乎是正确的,但是例如运行:

powershell.exe -File /mnt/c/path/to/script/script.ps1

我遇到了以下错误:
The argument '/mnt/c/path/to/script/script.ps1' to the -File parameter does not exist. Provide the path to an existing '.ps1' file as an argument to the -File parameter.

然后我必须:

cd /mnt/c/path/to/script
powershell.exe -File script.ps1

1
我也明白这个问题。有没有办法像这样使用完整的绝对路径?我不喜欢必须要进入目录。 - Sanjo
我没有找到任何使用完整绝对路径进行调用的方法,而且我不喜欢太多地使用 cd 命令... 此外,当我们想要保持在同一个文件夹中时,我们必须使用 cd - 命令(或者如果我们不想要新路径被回显,可以使用 cd - > /dev/null 命令)。 - gluttony

1
这些答案都不正确。`powershell.exe`是一个Windows程序,因此它期望作为参数传递一个Windows路径。
powershell.exe -File C:\\Users\\jason\\Documents\\WindowsPowerShell\\Scripts\\Write-EventLog-1777.ps1

在Linux中,反斜杠字符用于转义,因此您需要用另一个反斜杠来转义反斜杠。

0

这里有证据表明,使用WSL2,我们的软件可以使Powershell脚本加密和保护: 请看这张图片:

它还可以检测和终止使用fanotify的进程,因为我们认为攻击者可能会利用它来隐藏关键文件更改(它还可以查找和终止dtrace/strace/stap/bpftrace/debuggers以及打开/dev/kmem、/dev/mem、/proc/kcore和受保护进程的/proc/pid/mem等进程): 这张图片展示了加密的PowerShell脚本现在可以检测和终止可能的攻击者进程。


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接