将 PowerShell 命令保存在变量中并在 cmd 中执行

save PowerShell command in variable and execute in cmd

我想将 PowerSell 命令保存在变量中并在 cmd 中执行 问题:使用命令获取 exe 文件的当前路径:$(get-location).Path

我尝试了这个但没有用:

Set $path = powershell -Command $(get-location).Path
echo "$path"

这是另一种没有 Invoke-Expression 但有两个变量(command:string 和 parameters:array)的方法。这对我来说可以。假设 7z.exe 在系统路径中。

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

如果命令是已知的 (7z.exe),并且只有参数是可变的,那么这就可以了

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

顺便说一句,带一个参数的 Invoke-Expression 也适用于我,例如这有效

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

P.S。我通常更喜欢使用参数数组的方式,因为以编程方式组合比为 Invoke-Expression 构建表达式更容易。

尝试类似的命令行,注意我们需要使用 ^)

转义第一个 )
C:\Users\K\Desktop>for /f "delims=" %c in ('powershell -Command $(get-location^).Path') do @set "$path=%c"

C:\Users\K\Desktop>echo %$path%
C:\Users\K\Desktop

C:\Users\K\Desktop>

所以在批处理文件中使用

for /f "delims=" %%c in ('powershell -Command $(get-location^).Path') do @set "$path=%%c"
echo %$path%

然而,有许多更简单的方法可以找到当前目录。

正如建议的那样,避免任何与“路径”非常相似的变量名称,例如 $path,因为它可能会被剥离 $ 的下游应用程序误解,但在 cmd 级别最简单的方法是使用 %cd%值:-

C:\Users\K\Desktop>set "ExDir=%cd%" & echo %ExDir%
C:\Users\K\Desktop

C:\Users\K\Desktop>

在批处理文件中,通常使用带有存储的 %~dp0 的 pushd 和 popd,但是在命令行 popd 可能没有到 return 的目录堆栈,因此可以使用此方法。

C:\Users\K\Desktop>set "PopDir=%cd%"

C:\Users\K\Desktop>cd /d h:

H:\>echo doing somthing in %cd%
doing somthing in H:\

H:\>cd /D "%PopDir%"

C:\Users\K\Desktop>