Вопрос:
Мне поручено написать сценарий powershell для загрузки файла, который в конечном итоге будет выполняться как запланированное задание один раз в неделю. У меня нет опыта программирования в среде Windows, поэтому это был интересный день.
Я испытываю проблему с неожиданной обработкой $pwd и $home оболочки.
Я передаю в свою программу URL загрузки и файл назначения. Я хотел бы, чтобы файл назначения был относительным путем, например, download/temp.txt.gz
param($srcUrl, $destFile) $client = new-object System.Net.WebClient $client.DownloadFile($srcUrl, $destFile) Ungzip-File $destFile Remove-Item $destFile
Это происходит при вызове Remove-Item. Если $destFile – относительный путь, сценарий с радостью загружает файл и помещает его в файл относительно $home. Аналогично, я затем разархивирую это, и моя функция Ungzip-File использует System.IO.Filestream и, похоже, находит этот файл. Затем Remove-Item жалуется, что в пути нет пути к $pwd.
Я немного озадачен, так как все они являются частью оболочки, так сказать. Я не понимаю, почему эти функции будут обрабатывать путь по-разному, и, более того, я не уверен, как это исправить, так что работают как относительные, так и абсолютные пути. Я пробовал смотреть на методы io.path но поскольку мои $home и $pwd находятся на разных дисках, я даже не могу использовать IsPathRooted который казался таким близким, когда я его нашел.
Любая помощь?
Лучший ответ:
Вы должны знать, где вы находитесь на пути. $ pwd отлично работает в командной оболочке, но пусть скажет, что вы запустили свой скрипт из запланированного задания. Вы можете подумать, что $ pwd – это то, где ваш скрипт находится и код соответственно, но узнайте, что он действительно использует, скажем,% windir%system32.
В общем, я бы использовал fullpath для адресата и для путей относительно папки сценария я бы использовал $ PSScriptRoot/folder_name/file_path.
Там есть уловы. Например, я заметил, что $ PSScriptRoot будет корректно разрешен в скрипте, но не в блоке Param(). Я бы очень хотел использовать запись -verbose при кодировании и тестировании, поэтому вы знаете, что он думает об этом пути.
[CMDLETBINDING()] ## you need this! Param() write-verbose «path is $pwd» Write-Verbose «removing $destFile» Remove-Item $destfile
и добавьте -verbose, когда вы вызываете свой скрипт/функцию:
myscript.ps1 -verbose mydownloadfunction -verbose Ответ №1
Чтобы использовать относительный путь, вам нужно указать текущий каталог с ./
Пример: ./download/temp.txt.gz
Вы также можете изменить свое местоположение в середине скрипта с помощью Set-Location (псевдоним: cd)