Перевод командного файла DOS в PowerShell - PullRequest
5 голосов
/ 01 декабря 2011

Я пытаюсь перевести файл .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 ]

4 голосов
/ 01 декабря 2011

!var:find=replace! является строковой подстановкой для переменной, расширенной с задержкой.

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

Когда вы используете ! вместо % для переменной, вы хотите, чтобы DOS выполнял замену переменной во время выполнения (что, вероятно, то же самое, что вы думаете с %, но это не так). При % переменная подставляется в тот момент, когда команда анализируется (до ее запуска), поэтому, если переменная изменяется как часть команды, она не будет видна. Я думаю, что некоторые переключаются на использование ! все время, потому что это дает «нормальное» поведение.

Подробнее о отложенном расширении вы можете прочитать здесь

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

3 голосов
/ 02 декабря 2011

Первые две команды set variableName= используют модификаторы для расширения имени пакетного файла, представленного как %0.

%~n0, расширяет его до имени файла, а
%~dp0 расширяет его, чтобы включить букву диска и путь.

Последний, %*, представляет все аргументы, передаваемые в пакетный файл.

Дополнительную информацию можно найти в ответах здесь или здесь .

1 голос
/ 01 декабря 2011

Восклицательные знаки (!) В пакетных файлах DOS ссылаются на промежуточное значение, полезно, если вы находитесь в цикле for.Если бы вы использовали вместо этого% (в цикле), он возвращал бы одно и то же значение снова и снова.

Строки 3 и 4 устанавливают для SOME_VARIABLE промежуточное значение SOME_ARGUMENTS: \ = \"и SOME_ARGUMENTS:" = \ "соответственно.Опять же, я предполагаю, что эти строки взяты из цикла.

Что касается назначений переменных, назначения переменных Powershell работают следующим образом:

    $myVariable = "my string"

~ dp0 (в пакете DOS) переводитв путь (с буквой диска) текущего файла bat.Вы можете получить это в Powershell, выполнив «get-location».

Почему кто-то должен был бы установить переменную для STAR (*), я не знаю, поэтому я предполагаю, что была какая-то проблема с кодированием или другиепричина, по которой они не могли просто использовать звездочку.

~ n0 Я не уверен в этом;может быть, кто-то еще знает, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...