Подтвердить что ты не робот

Как запустить Powershell script из командной строки и передать каталог в качестве параметра

My Powershell script, Foo.ps1:

Function Foo($directory)
{
    echo $directory
}

if ($args.Length -eq 0)
{
    echo "Usage: Foo <directory>"
}
else
{
    Foo($args[0])
}

В консоли Windows:

powershell -command .\Foo.ps1

Результаты в: "Термин". \Foo.ps1 "не распознается как имя командлета, функции, файла script или исполняемой программы. Проверьте правописание имени или если путь был включен, проверьте правильность пути и повторите попытку."

Это несмотря на то, что Foo.ps1 находится в текущем каталоге, откуда я называю Powershell. Затем я попытался вызвать его, указав полный путь к файлу script; потому что этот путь содержит пространство, которое, я считаю, мне нужно каким-то образом процитировать. Также мне нужно передать аргумент script, который также является именем файла, содержащим одно или несколько пробелов. Независимо от того, что я пытаюсь, я не могу заставить его работать. Это мое лучшее предположение до сих пор:

powershell -command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'"

Что дает ошибку "Неожиданный токен C:\Dummy Directory 2\File.txt" в выражении или выражении. В строке: 1 char: 136 ".

Изменить: я выяснил, почему

powershell -command .\Foo.ps1

не работает. Это связано с тем, что файл Microsoft.PowerShell_profile.ps1 имел

cd C:\

так как при запуске powershell он меняет каталог.

4b9b3361

Ответ 1

попробуйте следующее:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'"

Ответ 2

вы вызываете script файл, а не команду, поэтому вам нужно использовать файл, например:

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space"

для PS V2

powershell.exe -noexit &'c:\my scripts\test.ps1'

(проверьте нижнюю часть этой страницы технологов http://technet.microsoft.com/en-us/library/ee176949.aspx)

Ответ 3

Используя флаг -Command, вы можете выполнить всю строку powershell, как если бы это была команда в приглашении PowerShell:

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'"

Это решило мою проблему с запуском команд PowerShell в событиях Visual Studio Post-Build и Pre-Build.

Ответ 4

Измените свой код на следующее:

Function Foo($directory)
    {
        echo $directory
    }

    if ($args.Length -eq 0)
    {
        echo "Usage: Foo <directory>"
    }
    else
    {
        Foo([string[]]$args)
    }

И затем вызовите его как:

powershell -ExecutionPolicy RemoteSigned -File "c:\foo.ps1" "c:\Documents and Settings" "c:\test"

Ответ 5

Добавьте смену параметров в верхней части файла ps1

Test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

результат

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII