diff --git a/changelogs/fragments/44508-win_lineinfile.yaml b/changelogs/fragments/44508-win_lineinfile.yaml
new file mode 100644
index 00000000000..eb5b2c0ae71
--- /dev/null
+++ b/changelogs/fragments/44508-win_lineinfile.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+- win_lineinfile - changed `-Path` to `-LiteralPath` so that square brackes in the path are interpreted literally -  https://github.com/ansible/ansible/issues/44508
diff --git a/lib/ansible/modules/windows/win_lineinfile.ps1 b/lib/ansible/modules/windows/win_lineinfile.ps1
index 258bded441e..0960b24736a 100644
--- a/lib/ansible/modules/windows/win_lineinfile.ps1
+++ b/lib/ansible/modules/windows/win_lineinfile.ps1
@@ -82,7 +82,7 @@ function Present($path, $regexp, $line, $insertafter, $insertbefore, $create, $b
 
 	# Check if path exists. If it does not exist, either create it if create == "yes"
 	# was specified or fail with a reasonable error message.
-	If (-not (Test-Path -Path $path)) {
+	If (-not (Test-Path -LiteralPath $path)) {
 		If (-not $create) {
 			Fail-Json @{} "Path $path does not exist !";
 		}
@@ -218,7 +218,7 @@ function Present($path, $regexp, $line, $insertafter, $insertbefore, $create, $b
 function Absent($path, $regexp, $line, $backup, $validate, $encodingobj, $linesep, $check_mode, $diff_support) {
 
 	# Check if path exists. If it does not exist, fail with a reasonable error message.
-	If (-not (Test-Path -Path $path)) {
+	If (-not (Test-Path -LiteralPath $path)) {
 		Fail-Json @{} "Path $path does not exist !";
 	}
 
@@ -316,7 +316,7 @@ $encoding = Get-AnsibleParam -obj $params -name "encoding" -type "str" -default
 $newline = Get-AnsibleParam -obj $params -name "newline" -type "str" -default "windows" -validateset "unix","windows";
 
 # Fail if the path is not a file
-If (Test-Path -Path $path -PathType "container") {
+If (Test-Path -LiteralPath $path -PathType "container") {
 	Fail-Json @{} "Path $path is a directory";
 }
 
@@ -339,7 +339,7 @@ If ($encoding -ne "auto") {
 # Otherwise see if we can determine the current encoding of the target file.
 # If the file doesn't exist yet (create == 'yes') we use the default or
 # explicitly specified encoding set above.
-ElseIf (Test-Path -Path $path) {
+ElseIf (Test-Path -LiteralPath $path) {
 
 	# Get a sorted list of encodings with preambles, longest first
 	$max_preamble_len = 0;
@@ -356,7 +356,7 @@ ElseIf (Test-Path -Path $path) {
 	}
 
 	# Get the first N bytes from the file, where N is the max preamble length we saw
-	[Byte[]]$bom = Get-Content -Encoding Byte -ReadCount $max_preamble_len -TotalCount $max_preamble_len -Path $path;
+	[Byte[]]$bom = Get-Content -Encoding Byte -ReadCount $max_preamble_len -TotalCount $max_preamble_len -LiteralPath $path;
 
 	# Iterate through the sorted encodings, looking for a full match.
 	$found = $false;