这基本上是 Change the current directory from a Bash script 的副本,除了我在 Windows 上并且希望能够从 powershell 脚本更改我的命令行目录。
我实际上是从 powershell 文件运行一个 python 脚本,从该 python 脚本解析输出目录,然后使用该输出作为要更改的目录,所以如果有办法从 python 脚本中执行此操作而不是 powershell 文件加分!
要 100% 清楚,是的,我知道“cd”和“os.chdir”,不,这不是我想要的 - 这只会更改脚本或批处理文件的当前目录,而不是您要更改的命令行正在运行!
代码如下(批处理文件是我的第一次尝试,我希望它是 PS1 脚本):
sw.bat - 添加到 sys $PATH 的父目录
@echo off
set _PY_CMD_="python C:\code\switch\switch.py %*"
for /f "tokens=*" %%f in ('%_PY_CMD_%') do (
cd /d %%f
)
开关.py
import os
import argparse
LOCAL = r'C:\code\local'
def parse_args():
parser = argparse.ArgumentParser(description='Workspace manager tool.')
parser.add_argument('command', type=str, help='The command to execute, or workspace to switch to.')
return parser.parse_args()
def execute_command(command):
if command in ['l', 'local']:
print(LOCAL)
def main():
args = parse_args()
execute_command(args.command)
if __name__ == '__main__':
main()
最佳答案
如果我答对了你的问题,一个简单的方法是使用 [SS64]: FOR /F .
脚本.py:
target_dir = r"C:\Program Files"
print(target_dir)
script.bat:
@echo off
set _PY_CMD="e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" script.py
for /f "tokens=*" %%f in ('%_PY_CMD%') do (
pushd "%%f"
)
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]> ver Microsoft Windows [Version 10.0.18362.239] [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]> script.bat [cfati@CFATI-5510-0:C:\Program Files]> [cfati@CFATI-5510-0:C:\Program Files]> popd [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057062514]>
注意事项:
- 我使用了pushd(而不是cd),因为简单的popd 会返回到原始目录。缺点是必须记住(堆栈)他们调用了多少次 pushd 才能匹配对应的 popd。如果要切换到 cd,请像这样使用:
cd/d %%f
@EDIT0:
一开始,问题只针对batch,之后是PowerShell (PS) 要求(可以作为不同的问题)被添加。
无论如何,这是一个可以解决问题的简单(虚拟)脚本(我不是 PS 专家)。
script.ps1:
$PyCmdOutput = & 'e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe' 'script.py'
Set-Location $PyCmdOutput
输出:
PS E:\Work\Dev\StackOverflow\q057062514> .\script.ps1 PS C:\Program Files>
关于python - 相当于 Unix "shell function"的 Powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57062514/