将DOS批处理文件转换为PowerShell

时间:2011-12-01 15:45:34

标签: powershell batch-file

我正在尝试将.bat文件转换为PowerShell,并且无法理解一些代码片段正在做什么:

set MY_VARIABLE = "some\path\here"  
"!MY_VARIABLE:\=/!"

上面第2行是做什么的?特别是,我不明白:\ = /正在做什么,因为我已经看到变量else在代码被引用的地方,如!MY_VARIABLE!。

另一个混淆点是下面的代码。

set SOME_VARIABLE=!SOME_ARGUMENTS:\=\\!  
set SOME_VARIABLE=!SOME_ARGUMENTS:"=\"!

另外,你能告诉我上面第3和第4行的情况吗?

以下变量会转化为PowerShell的内容是什么?

set TN0=%~n0  
set TDP0=%~dp0  
set STAR=%*

非常感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:4)

!var:find=replace!是对延迟扩展的变量的字符串替换。

http://www.robvanderwoude.com/ntset.php#StrSubst

当您对变量使用!而不是%时,您希望DOS在执行时执行变量替换(这可能是您认为它对%的影响,但是它没有)。对于%,变量在解析命令时(在运行之前)被替换 - 因此如果变量作为命令的一部分发生变化,则不会看到变量。我认为有些人会一直转向使用!,因为它会产生“正常”的行为。

您可以在此处详细了解延迟扩展

http://www.robvanderwoude.com/ntset.php#DelayedExpansion

答案 1 :(得分:3)

前两个set variableName=命令使用修饰符来扩展批处理文件的名称,表示为%0

%~n0将其展开为文件名,然后是 %~dp0将其展开以包含驱动器号和路径。

最后一个%*表示传递给批处理文件的所有参数。

其他信息可在答案herehere中找到。

答案 2 :(得分:1)

感叹号(!)在DOS批处理文件中引用中间值,如果您处于for循环中,则非常有用。如果您使用%而不是(在循环中),它将反复返回相同的值。

第3行和第4行分别将“SOME_VARIABLE”设置为“SOME_ARGUMENTS:\ = \”和SOME_ARGUMENTS:“= \”的中间值。我再次猜测这些线来自循环。

对于变量赋值,Powershell变量赋值的工作方式如下:

    $myVariable = "my string"

~dp0(在DOS批处理中)转换为当前bat文件的路径(带驱动器号)。你可以通过“获取位置”在Powershell中获得它。

为什么有人需要为STAR(*)设置一个变量超出我的范围,所以我假设有一些编码问题或其他原因,他们不能只使用星号。

~n0我不确定;也许别人知道那是什么。