2011-12-01 119 views
4

我想翻译.bat文件到PowerShell和具有理解什么的一小段代码是干什么的麻烦:翻译DOS批处理文件的PowerShell

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

什么是上面做2号线?特别是,我不明白什么:\ = /正在做什么,因为我已经看到了变量,其他代码被引用像!MY_VARIABLE !.

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

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

另外,你能告诉我上面第3行和第4行发生了什么吗?

以下哪些变量也会转换为PowerShell?

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

对此非常感谢。谢谢。

回答

1

DOS批处理文件中的感叹号(!)引用中间值,如果您处于for-loop状态,则有用。如果您要使用%(在循环中),它会一遍又一遍地返回相同的值。

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

对于变量赋值,PowerShell的变量赋值的工作是这样的:

$myVariable = "my string" 

〜DP0(在DOS批处理)转换为路径(以盘符)当前bat文件的。您可以通过执行“获取位置”来在Powershell中获得。

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

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

+0

感谢这很长的路要帮助我将这个批处理文件转换为PowerShell – user1075715

4

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

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

当您使用!,而不是%的变量,你要DOS做在执行时的变量替换(这可能是你认为它与%做,但事实并非如此)。使用%时,在解析命令(在运行之前)时会替换该变量 - 因此,如果该变量作为命令的一部分进行更改,则不会被看到。我认为有些开关总是使用!,因为它会给出“正常”的行为。

你可以阅读更多关于延迟扩展这里

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

+0

谢谢。这太棒了。 – user1075715

2

前两个set variableName=命令使用改性剂对批处理文件的名称,表示为%0扩大。

%~n0将其展开为文件名,并且
%~dp0将其展开为包含驱动器号和路径。

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

可以找到更多的信息here