Powershell: запись хоста в текущий каталог /$computername
Я пытаюсь вывести CSV в текущем каталоге, но в папке, которая соответствует $ComputerName, которая уже существует. Я делаю это для списка машин регулярно, и вместо того, чтобы вручную помещать их в их папку, было бы здорово сделать это в сценарии.
Вот текущий код, пишущий в каталог скриптов.
#writing file to
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
Write-Host ("Saving CSV Files at " + [Environment]::CurrentDirectory + " Named the following.")
Write-Host $PritnersFilename
Я пытался добавить $ ComputerName в разные места, но безуспешно.
Примеры:
Write-Host ("Saving CSV Files at " + [Environment]::CurrentDirectory\$ComputerName + " Named the following.")
Write-Host ("Saving CSV Files at " + [Environment]::(CurrentDirectory\$ComputerName) + " Named the following.")
РЕДАКТИРОВАТЬ: $ComputerName является переменной целевого, а не локального хоста
2 ответа
Было бы проще, если бы я увидел весь код. Но я привел пример, потому что я чувствовал, что было бы легче объяснить это так, потому что я не знаю, откуда вы берете свои переменные.
Довольно просто, он проходит по компьютерам и, если в текущей папке нет папки с именем $computername, он создает ее. Затем приходит ваш код экспорта, где он экспортирует данные компьютера в ту папку, которую мы только что создали.
Ключевая часть: использование ".\" - то же самое, что и текущая папка.
cd C:\Scriptfolder\
# computer variables for example
$computers = @()
$computers += "HOST1"
$computers += "HOST2"
$computers += "HOST3"
# looping through all objects
Foreach($computer in $computers){
# creating folder named after computername if one doesn't exist
if(!(Test-Path ".\$computer")){
New-Item -ItemType Directory -Name $computer -Path ".\"
}
# output path with computername in it
$outputpath = ".\$computer\output.csv"
# your export code
$computer | Export-CSV $outputpath
}
[Environment]::CurrentDirectory\$ComputerName
из-за нахождения внутри (...)
и используется в качестве операнда +
оператор, анализируется в режиме выражения, что вызывает синтаксическую ошибку.
Обзор режимов синтаксического анализа PowerShell см. В моем ответе.
Тебе нужно "..."
(расширяемая строка) для выполнения конкатенации строк с использованием оператора подвыражения $(...)
встраивать выражение [Environment]::CurrentDirectory
и встраивание ссылки на переменную $ComputerName
непосредственно.
"$([Environment]::CurrentDirectory)\$ComputerName"
Для обзора расширения строк (интерполяции строк) в PowerShell см. Мой ответ.
В качестве альтернативы, вы можете использовать выражение с +
а также (или даже смешать два подхода):
# Enclose the whole expression in (...) if you want to use it as a command argument.
[Environment]::CurrentDirectory + '\' + $ComputerName
Примечание. Самый надежный (хотя и более медленный) метод построения путей к файловой системе - это использование Join-Path
командлет:
# Enclose the whole command in (...) to use it as part of an expression.
Join-Path ([Environment]::CurrentDirectory) $ComputerName
Обратите внимание на необходимость (...)
вокруг [Environment]::CurrentDirectory
чтобы убедиться, что он распознается как выражение. В противном случае, поскольку команда анализируется в режиме аргумента, [Environment]::CurrentDirectory
будет рассматриваться как буквальный.