我正在尝试将.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=%*
非常感谢任何帮助。感谢。
答案 0 :(得分:4)
!var:find=replace!
是对延迟扩展的变量的字符串替换。
http://www.robvanderwoude.com/ntset.php#StrSubst
当您对变量使用!
而不是%
时,您希望DOS在执行时执行变量替换(这可能是您认为它对%
的影响,但是它没有)。对于%
,变量在解析命令时(在运行之前)被替换 - 因此如果变量作为命令的一部分发生变化,则不会看到变量。我认为有些人会一直转向使用!
,因为它会产生“正常”的行为。
您可以在此处详细了解延迟扩展
答案 1 :(得分:3)
前两个set variableName=
命令使用修饰符来扩展批处理文件的名称,表示为%0
。
%~n0
将其展开为文件名,然后是
%~dp0
将其展开以包含驱动器号和路径。
最后一个%*
表示传递给批处理文件的所有参数。
答案 2 :(得分:1)
感叹号(!)在DOS批处理文件中引用中间值,如果您处于for循环中,则非常有用。如果您使用%而不是(在循环中),它将反复返回相同的值。
第3行和第4行分别将“SOME_VARIABLE”设置为“SOME_ARGUMENTS:\ = \”和SOME_ARGUMENTS:“= \”的中间值。我再次猜测这些线来自循环。
对于变量赋值,Powershell变量赋值的工作方式如下:
$myVariable = "my string"
~dp0(在DOS批处理中)转换为当前bat文件的路径(带驱动器号)。你可以通过“获取位置”在Powershell中获得它。
为什么有人需要为STAR(*)设置一个变量超出我的范围,所以我假设有一些编码问题或其他原因,他们不能只使用星号。
~n0我不确定;也许别人知道那是什么。